Определение блока - разница между фигурными скобками и do-end?

Кто-нибудь может объяснить, почему следующий код прерывается с ошибкой

irb(main):186:0> print ((1..10).collect do |x| x**2 end)
SyntaxError: (irb):186: syntax error, unexpected keyword_do_block,
expecting ')'
print ((1..10).collect do |x| x**2 end)
                         ^
(irb):186: syntax error, unexpected keyword_end, expecting $end
print ((1..10).collect do |x| x**2 end)
                                      ^
        from /usr/bin/irb:12:in `<main>'

, тогда как следующий код с той же функциональностью работает, как ожидалось?

irb(main):187:0> print ((1..10).collect { |x| x**2 })
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]=> nil

Я действительно считал, что фигурные скобки "{}" могут заменить "do end" произвольно в блоке определение.

Я знаю, что могу "исправить" первый вызов, опустив пробел между print метод и первую скобку, но мне интересно объяснение почему он ведет себя иначе.

9
задан Andrew Grimm 21 September 2011 в 00:00
поделиться