metodos - Bloque de Ruby y argumentos sin apariencia
que significa en ruby (1)
Extraje un simple ejemplo:
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)} })
Me pregunto por qué el primer pp produce:
[1, 2, 3]
Mientras todos los oders están dando:
[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}]
Supongo que tiene algo que ver con la precedencia del operador. ¿Dónde puedo encontrar una buena explicación?
Es porque estás llamando
pp x.map
y pasar un bloque a pp (que lo ignora)
Como se explica en el libro Programming Ruby
Las llaves tienen una alta precedencia; do tiene una baja precedencia
Entonces, efectivamente, las llaves se relacionan con la llamada de función más cercana (x.map) mientras que se une a la más lejana (pp). Eso es un poco simplista, pero debería explicar esta situación