Обычное соглашение - { ... }
блоки для однолинейных и do ... end
для многолинейных. Я обычно придерживаюсь этого соглашения, но если я когда-нибудь стану королем, я думаю, что буду использовать do .. end
чаще.
Иногда проблема с {}
заключается в том, что {}
связывается более плотно, чем do end
, поэтому только способ написать блок режима поэзии для метода, который также имеет параметры, - это использовать do end
, иначе блок будет частью параметра и не будет напрямую передан методу.
def f x
yield x
end
f 123 do |n| p n end # works
f 123 { |n| p n } # does not work
f(123) { |n| p n } # works, of course
Конечно, если вы хотели присоединить блок к параметру в режиме поэзии, то вы выиграли с {}
, за которым следует do end
.
def g ; p ['g', yield] end
def f x; p ['f', yield] end
f g { 2 } do 3 end
["g", 2]
["f", 3]
Наконец, и вопреки некоторым советам, которые вы получили здесь, ;
- это , а не , необходимое до end
.