Definición de bloque: ¿diferencia entre llaves y do-end?

¿Alguien puede explicar por qué el siguiente código aborta con un error

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>'

mientras que el siguiente código con la misma funcionalidad funciona como se esperaba?

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

Creí que las llaves "{}" pueden sustituir "do end" arbitrariamente en la definición de bloque.

Sé que puedo "arreglar" la primera llamada omitiendo un espacio entre el método de impresión y el primer paréntesis, pero estoy interesado en una explicaciónpor qu se comporta diferente.

Respuestas a la pregunta(2)

Su respuesta a la pregunta