Read more

Ruby blocks: Braces and do/end have different precedence

Henning Koch
April 05, 2012Software engineer at makandra GmbH

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

Illustration online protection

Rails Long Term Support

Rails LTS provides security patches for old versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2)

  • Prevents you from data breaches and liability risks
  • Upgrade at your own pace
  • Works with modern Rubies
Read more Show archive.org snapshot

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"]
Posted by Henning Koch to makandra dev (2012-04-05 11:11)