Уведомления
Очистить всё
Новичкам
5
Сообщения
4
Пользователи
1
Реакции
455
Просмотры
22 сентября 2024 12:26
Месяц на Rails 7.2 после шести лет на C#. Делегаты и LINQ я понимаю, а в Ruby путаюсь: блок, yield, &block, proc, lambda и ещё ->. Что из этого встречается в обычном коде каждый день, а что пока можно не знать? Ruby 3.3.
4 ответа
24 сентября 2024 08:18
По-рабочему, 90% времени нужен только блок, то, что в do ... end или в фигурных скобках. Метод вызывает его через yield, ничего не объявляя:
def with_timing(label)
started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
result = yield
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
puts "#{label}: #{(elapsed * 1000).round} ms"
result
end
users = with_timing("load users") { User.where(active: true).to_a }
def each_admin(&block)
User.where(admin: true).find_each(&block)
end
square = ->(x) { x * x }
square.(4) # => 16
&block нужен, когда блок надо сохранить или передать дальше, как в each_admin. lambda и -> одно и то же, это ближе всего к твоим делегатам, их кладут в scope и в константы. proc в прикладном коде почти не встречается.
26 сентября 2024 23:22
в Python на этом месте просто передают функцию, и никто не страдает. но признаю, with_timing("...") { ... } читается приятно