Функции и методы
def — функции-конструкторы
def возвращает объект, когда тело - свойства (и значение, когда тело им
кончается, - ниже):
def make_env(name, replicas, debug)
replicas: replicas
log_level: debug ? "debug" : "warn"
db_url: "postgres://db.#{name}.internal:5432/app"
end
environments:
dev: make_env("dev", 1, true)
prod: make_env("prod", 6, false)
end
Один def вместо трёх скопированных YAML-файлов — главный анти-копипаст
инструмент языка.
Функция, которая возвращает значение
Функция, тело которой кончается выражением, возвращает это выражение (D40).
Перед ним можно писать привязки и assert, так что шаг можно назвать:
def ports_of(services)
all = services.map (s, i) -> s.port end
assert all.len() > 0, "no services"
all.uniq().sort()
end
ports: ports_of(catalogue)
Многострочная лямбда подчиняется тому же правилу; однострочная,
(x) -> x * 2 end, и так была выражением.
Три случая и почему они такие
- Свойства или последнее значение - не то и другое сразу. Тело со
свойствами
key:, которое ещё и кончается выражением, - этоE0215. Вернуть значение значило бы потерять свойства, вернуть свойства - потерять значение, и в обоих случаях что-то пропадало бы бесследно. Сделайте значение свойством (value: ...) или уберите свойства. - Значение, которое никто не использует, - ошибка. Голое выражение в любом
другом месте - в начале файла, в
domain, до последней строки функции - этоE0214. В Aura нет побочных эффектов, так что значение, которое никуда не идёт, ничего не сделало: автор почти всегда имел в видуkey:(вывести),name =(использовать дальше) илиassert(проверить), и подсказка называет все три. До D40 такая строка вычислялась и молча выбрасывалась. - Только привязки и проверки - по-прежнему пустой объект. Тело из одних
=иassertвозвращает{}, как и раньше: ничто в нём не задумывалось результатом, значит, ничего и не выбрасывается.
Обе ошибки выдаёт aura check, поэтому редактор показывает их сразу, пока вы
печатаете.
Лямбды
double = (x) -> x * 2 end
up: ["a", "b"].map (s, i) -> s.upper() end # trailing-лямбда
Колбэк map/filter получает элемент и индекс; лишние параметры можно
не объявлять.
Методы
Вызываются через точку, образуют цепочки:
active: services.compact().uniq().map (s, i) -> s.upper() end
Полный список — в справочнике методов. Часто используемые:
- списки:
mapfiltercompact(убратьnull)uniqfirstlastjoin(sep)contains(x)get(i, default) - объекты:
merge(правый перекрывает)keysvaluescontains(key)get(key, default) - строки:
upperlowerlencontains(sub)+ парсеры форматов
Тернарный оператор
Единственная ветвящаяся конструкция языка:
mode: is_prod ? "webhook" : "long_polling"
Условие обязано быть Bool — «правдивости» (truthiness) в Aura нет,
E0306 на любом другом типе.