2009-01-07 19 views
9

I extrajeron ejemplo simple:Rubí bloque y unparenthesized argumentos

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é primera pp produce:

[1, 2, 3] 

Mientras que todos los oders están dando:

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

I asumir que tiene algo que ver con la precedencia del operador. ¿Dónde puedo encontrar una buena explicación?

+2

Esto es un duplicado de [Ruby Block Syntax Error] (http://StackOverflow.Com/q/6854283/), [El bloque de código pasado a 'each' funciona con corchetes pero no con 'do' -'end' (ruby)] (http://StackOverflow.Com/q/6718340/), [Definición de bloque - diferencia entre llaves y' do' -'end'?] (http://StackOverflow.Com/q/6179442/), [Ruby multiline block sin 'do'' end'] (http://StackOverflow.Com/q/3680097/), [Usando 'do' block vs brackets' {} ' ] (http://StackOverflow.Com/q/2122380/) y [¿Cuál es la diferencia o el valor de estos estilos de codificación de bloque en Ruby?] (http://StackOverflow.Com/q/533008/). –

+0

Partes de una sesión de palanca que usa Ruby-2.2.0 en esta fecha de publicación. pp_hash = x.map do | i | {: value => i,: double => (i * 2)} end => [{: value => 1,: double => 2}, {: value => 2,: double => 4} , {: value => 3,: double => 6}] pp_hash.join (",") "{: value => 1,: double => 2}, {: value => 2,: double => 4}, {: value => 3,: double => 6} " que es probablemente más deseable en los usos actuales de Json pero eso es una cuestión de estilo solo para la lectura de la salida. A veces, no importa cuál va a pasar, siempre y cuando su código pueda manejar el tipo correcto. pp_hash = pp_hash.join (",") –

+0

Esto es lo que realmente obtuve antes de salir en una tangente. Esta es la primera parte de la palanca ... [53] palanca (principal)> pp x.map do | i | {: key => i,: value => (i * 2)} end # => #

Respuesta

14

Es debido a que está llamando

pp x.map 

y pasando un bloque de PP (que lo ignora)

Como se explica en el libro Programming Ruby

Los apoyos tienen una alta prioridad; do tiene una precedencia baja

Entonces, efectivamente, las llaves se vinculan a la llamada de función más cercana a ellas (x.map) mientras que se une a la más lejana (pp). Eso es un poco simplista, pero debería explicar esta situación

+0

Gracias @Gareth, ¿conoce alguna referencia formal? ? Algunas especificaciones del lenguaje, etc. – rkj