Основное различие между блоком и функцией согласно вашему примеру состоит в том, что блок выполняется в контексте вызывающей функции .
Так что, если ваш пример был:
def self.do_something(object_id)
x = "boogy on"
self.with_params(object_id) do |params|
some_stuff(params)
puts x
end
end
Код в блоке может обращаться к переменной x, которая была определена вне блока. Это называется закрытием. Вы не могли бы сделать это, если бы вы просто вызывали функцию согласно второму примеру.
Еще одна интересная вещь о блоках - они могут влиять на поток управления внешней функцией. Так что можно сделать:
def self.do_something(object_id)
self.with_params(object_id) do |params|
if some_stuff(params)
return
end
end
# This wont get printed if some_stuff returns true.
puts "porkleworkle"
end
Если вызов some_stuff в блоке возвращает истинное значение, блок вернется. Это вернется из блока и из метода дозирования . porkleworkle не получит вывод.
В ваших примерах вы не полагаетесь ни на одно из них, поэтому использование вызовов функций, вероятно, намного удобнее.
Однако во многих ситуациях использование блоков, позволяющих вам воспользоваться этими преимуществами, неоценимо.