Уведомления
Очистить всё
Новичкам
3
Сообщения
2
Пользователи
2
Реакции
386
Просмотры
19 августа 2025 21:22
Я аналитик, в основном пишу 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 ответа
22 августа 2025 07:10
&: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
22 августа 2025 07:35
Спасибо, теперь читается. Больше всего порадовал sum(&:amount) без map, переписал так все свои скрипты, их пока четыре)