2009-07-03 22 views
10

Necesito obtener el número de parámetros que toma un bloque determinado. Por ejemplo:Obteniendo el número de parámetros de bloque

foobar(1,2,3) { |a, b, c| 
} 

def foobar(x, y, z, &block) 
    # need to obtain number of arguments in block 
    # which would be 3 in this example 
end 

Esto es posible en la troncal 1.9, pero no en ningún lanzamiento oficial. Esperaba que hubiera alguna forma de hacerlo sin tener que descargar un módulo de gema/extensión por separado.

Respuesta

29

Cuando materializa un bloque con &, se convierte en un objeto Proc, que tiene un método arity. Solo ten cuidado: devuelve el complemento de uno si el proceso toma un * splat arg.

def foobar(x, y, z, &block) 
    p block.arity 
end 

(. Respuesta a través de "El lenguaje de programación Ruby" libro)

+1

me ganaste :) +1 – Gishu

+6

Derecha. Tenga en cuenta que '{|| nil} 'tendrá una aridad de 0, pero' {nil} 'tendrá una aridad de -1. –

+0

Hola Justin, gracias por la respuesta, esto es exactamente lo que necesitaba :) – Exponent

8

Es esto lo que está buscando ...

def foobar(x, y, z, &block) 
    # need to obtain number of arguments in block 
    # which would be 3 in this example 
    case block.arity 
    when 0 
     yield "i have nothing" 
    when 1 
     yield "I got ONE block arg" 
    when 2 
     yield "I got TWO block args" 
    when 3 
     yield "I got THREE block args" 
    end 
end 

foobar(1,2,3) { |a, b, c| 
    puts a 
} 

Salidas:

D:\ruby\bin>ruby -v 
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] 

D:\ruby\bin>ruby c:\Temp.rb 
I got THREE block args 

ver también - A Ruby HOWTO: Writing A Method That Uses Code Blocks de codahale.com

+0

Hola Gishu. Gracias por el artículo, definitivamente voy a necesitar leer esto. – Exponent

Cuestiones relacionadas