Bloco Ruby e argumentos sem parênteses

Eu extraí um exemplo simples:

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)} }) 

Eu estou querendo saber porque primeiro pp produz:

 [1, 2, 3] 

Enquanto todos os oders estão dando:

 [{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}] 

Eu suponho que tenha algo a ver com a precedência do operador. Onde posso encontrar uma boa explicação?

É porque você está chamando

 pp x.map 

e passando um bloco para pp (que o ignora)

Como explicado no livro Programming Ruby

Chaves têm uma alta precedência; tem uma baixa precedência

Então, efetivamente, chaves ligam a chamada de function mais próxima a elas (x.map) enquanto se ligam mais longe (pp). Isso é um pouco simplista, mas deve explicar essa situação