Posted over 8 years ago. Visible to the public. Repeats. Linked content.

Ruby blocks: Braces and do/end have different precedence

Braces and do/end are completely swappable—almost all the time. They have different precedence. It’s not often that anyone comes across what this means in practice.

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


Right way

names = ['bRUce', 'STaN', 'JOlIE'] # Blocks in braces are passed to the rightmost method print { |name| name.downcase } print( 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 do |name| name.downcase end print( { |name| name.downcase } # equivalent => #<Enumerator:0x00000001e793b0> # Combined print { |name| name.downcase } do |name| name.capitalize end print( { |name| name.downcase }) do |name| name.capitalize end # equivalent => ["bruce", "stan", "jolie"]

makandra has been working exclusively with Ruby on Rails since 2007. Our laser focus on a single technology has made us a leader in this space.

Owner of this card:

Henning Koch
Last edit:
over 4 years ago
by Emanuel De
ruby, lambda, proc, block
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Henning Koch to makandra dev
This website uses cookies to improve usability and analyze traffic.
Accept or learn more