begin/end
строго поток управления, а не блоки.
begin
puts "hi"
end
# => "hi"
Код запускается немедленно. Если бы это был блок, его нужно было бы как-то вызвать, чтобы в нем выполнялся код, как в этом примере:
def a_method; end
a_method { puts "hi" }
# nothing..
def a_method
yield
end
a_method { puts "Hi!" }
# => "Hi!"