Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Функции и методы

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

Полный список — в справочнике методов. Часто используемые:

  • списки: map filter compact (убрать null) uniq first last join(sep) contains(x) get(i, default)
  • объекты: merge (правый перекрывает) keys values contains(key) get(key, default)
  • строки: upper lower len contains(sub) + парсеры форматов

Тернарный оператор

Единственная ветвящаяся конструкция языка:

mode: is_prod ? "webhook" : "long_polling"

Условие обязано быть Bool — «правдивости» (truthiness) в Aura нет, E0306 на любом другом типе.