2011-09-14 12 views
7

supe por heckle que¿Cómo se comporta foo (& nil) de forma diferente que foo (& "not a proc")?

[1, 2, 3].each(&nil) 

no causa ningún error - simplemente devuelve un enumerador.

Por el contrario,

[1, 2, 3].each(&"") 

plantea

TypeError: wrong argument type String (expected Proc) 

Además, &nil causas block_given? para volver falsa

def block_given_tester 
    if block_given? 
    puts "Block given" 
    else 
    puts "Block not given" 
    end 
end 

block_given_tester(&nil) # => Block not given 

No es porque NilClass implementa to_proc - Revisé la RDoc.

puedo entender por qué que sería bueno tener &nil, pero no estoy seguro de cómo se hace. ¿Es esta una de las maneras en que nil tiene un comportamiento especial no compartido por otros objetos?

Respuesta

7

La respuesta se puede encontrar mirando el código fuente de Ruby.

Rubí 1.8:

observar la función block_pass en el archivo eval.c. Tenga en cuenta que trata nil especialmente desde objetos Proc (la macro NIL_P). Si la función pasa un valor nulo, evalúa un bloque vacío (creo) y lo devuelve. El código justo después de que comprueba si el objeto es un objeto Proc (la función rb_obj_is_proc) y plantea la excepción "tipo de argumento incorrecto (Proc esperado") si no lo es.

de Ruby 1.9.2:

Mira el método caller_setup_args en el archivo vm_insnhelper.c. Convierte el proceso con to_proc solo si no es nulo; de lo contrario, la conversión de tipo y la verificación de tipo quedan anuladas.

+0

Supongo que está buscando en una de las 1.8 sucursales no en una de las 1.9 sucursales. –

+0

Sí, eso es de Ruby 1.8, ya que es el código que tengo disponible. Ahora estoy descargando el código de Ruby 1.9.2 para ver si algo ha cambiado. –

+1

He editado mi respuesta para Ruby 1.9.2. –

Cuestiones relacionadas