Ruby blocks: Braces and do/end have different precedence

Updated . Posted . Visible to the public. Repeats.

TL;DR {} binds stronger than do … end (as always in Ruby, special characters bind stronger than words)

Demo

✔️ Right way

names = ['bRUce', 'STaN', 'JOlIE']

# Blocks in braces are passed to the rightmost method
print names.map { |name| name.downcase }
print(names.map do |name| name.downcase end) # equivalent
=> ["bruce", "stan", "jolie"]

❌ Wrong way

Avoid the examples below, as you pass at least one block to print and not to the enumerator.

names = ['bRUce', 'STaN', 'JOlIE'] 

# Blocks in do…end are passed to the leftmost method
print names.map do |name| name.downcase end
print(names.map) { |name| name.downcase } # equivalent
=> #<Enumerator:0x00000001e793b0>

# Combined
print names.map { |name| name.downcase } do |name| name.capitalize end
print(names.map { |name| name.downcase }) do |name| name.capitalize end # equivalent
=> ["bruce", "stan", "jolie"]
Henning Koch
Last edit
Michael Leimstädtner
Keywords
ruby, lambda, proc, block
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra dev (2012-04-05 09:11)