Forum: Ruby difference between {} and do/end

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jeff S. (Guest)
on 2009-02-20 18:30
(Received via mailing list)
I'm coming back to Ruby after a couple years away, and finding I've
forgotten some of the basics.  What's the difference between { ... }
blocks and do ... end blocks?  In particular, why does one of the
following work, while the other fails?

'%61lice'.gsub! /%(\d+)/ do $1.to_i(16).chr end # => "alice"
'%61lice'.gsub! /%(\d+)/ {  $1.to_i(16).chr   } # => SyntaxError
karlvonl (Guest)
on 2009-02-20 18:41
(Received via mailing list)
On Feb 20, 11:25 am, Jeff S. <removed_email_address@domain.invalid> wrote:
> I'm coming back to Ruby after a couple years away, and finding I've
> forgotten some of the basics.  What's the difference between { ... }
> blocks and do ... end blocks?  In particular, why does one of the
> following work, while the other fails?
>
> '%61lice'.gsub! /%(\d+)/ do $1.to_i(16).chr end # => "alice"
> '%61lice'.gsub! /%(\d+)/ {  $1.to_i(16).chr   } # => SyntaxError

It has to do with operator precedence. {...} has high precedence,
while do ... end has low precedence. So in your examples above, the
do...end block is pased to the gsub! method, while the {...} block is
passed to the regex. You can fix the second example using parens:

'%61lice'.gsub!(/%(\d+)/) {  $1.to_i(16).chr   } => "alice"
Jeff S. (Guest)
on 2009-02-20 19:29
(Received via mailing list)
karlvonl wrote:
> while do ... end has low precedence. So in your examples above, the
> do...end block is pased to the gsub! method, while the {...} block is
> passed to the regex. You can fix the second example using parens:
>
> '%61lice'.gsub!(/%(\d+)/) {  $1.to_i(16).chr   } => "alice"

Thank you!
David M. (Guest)
on 2009-02-21 00:31
(Received via mailing list)
Jeff S. wrote:
> I'm coming back to Ruby after a couple years away, and finding I've
> forgotten some of the basics.  What's the difference between { ... }
> blocks and do ... end blocks?

Another difference is that {} can be confused with a hash literal. I
can't think of a good example where it's actually ambiguous, though.
Joel VanderWerf (Guest)
on 2009-02-21 00:47
(Received via mailing list)
David M. wrote:
> Jeff S. wrote:
>> I'm coming back to Ruby after a couple years away, and finding I've
>> forgotten some of the basics.  What's the difference between { ... }
>> blocks and do ... end blocks?
>
> Another difference is that {} can be confused with a hash literal. I
> can't think of a good example where it's actually ambiguous, though.

Isn't

p {1=>2}

such an example? The parser decides that it's a block and barfs on the
=>.
This topic is locked and can not be replied to.