Аналитик учит Ruby ...
 
Уведомления
Очистить всё

Аналитик учит Ruby для скриптов: что значат &:amount, ||= и прочие закорючки

3 Сообщения
2 Пользователи
2 Реакции
386 Просмотры
Заур74
Сообщения: 3
Автор темы
Пишет в irb аналитик
Присоединился: 1 год назад
[#87]

Я аналитик, в основном пишу SQL, а Ruby взял, чтобы самому гонять выгрузки и не дёргать разработчиков. Читаю чужие скрипты и спотыкаюсь на значках:

totals = rows.map(&:amount).sum
@rates ||= load_rates
region = row.region || "unknown"
report = rows.group_by(&:region).transform_values { _1.sum(&:amount) }
data = File.read(path).then { JSON.parse(_1) }

Что такое &:amount, ||=, _1 и зачем then? В поиске такое даже не набрать.


2 ответа
kirill_spb
Сообщения: 27
Собрал свой gem разработчик инструментов
Присоединился: 4 года назад

&:amount превращает символ в блок, то есть это короткая запись { |r| r.amount }. a ||= b значит «если в a nil или false, присвой b», так обычно кэшируют. Обычный || в третьей строке: если слева nil, берётся правое. _1 это первый аргумент блока без имени, а с Ruby 3.4 вместо него можно писать it. then передаёт значение в блок и возвращает результат блока, удобно в цепочках. Те же строки, но развёрнуто:

rows.map { |r| r.amount }.sum         # то же, что rows.map(&:amount).sum
rows.sum(&:amount)                    # а можно сразу, без map
@rates || (@rates = load_rates)       # примерно так работает ||=
rows.group_by(&:region).transform_values { it.sum(&:amount) }
JSON.parse(File.read(path))           # то же без then

Ответ
Заур74
Сообщения: 3
Автор темы
Пишет в irb аналитик
Присоединился: 1 год назад

Спасибо, теперь читается. Больше всего порадовал sum(&:amount) без map, переписал так все свои скрипты, их пока четыре)


Ответ