I extracted simple example:
require 'pp'
x = 1..3
pp x.map do |i| {:value => i, :double => (i*2)} end
pp x.map { |i| {:value => i, :double => (i*2)} }
pp(x.map do |i| {:value => i, :double => (i*2)} end)
pp(x.map { |i| {:value => i, :double => (i*2)} })
I am wondering why first pp produces:
[1, 2, 3]
While all the oders are giving:
[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]
I assume it has something to do with operator precedence. Where can I find good explanation?
It's because you're calling
and passing a block to pp (which ignores it)
As explained in the Programming Ruby book
So, effectively, braces tie to the function call closest to them (x.map) whereas do binds to the furthest away (pp). That's a bit simplistic but it should explain this situation