2010-01-12 16 views

Respuesta

44

¡Esto realmente funciona como se esperaría en Ruby 1.9!

define_method :m do |a = false| 
end 

Si necesita 1.8 compatibilidad, pero no necesariamente necesita un cierre para definir su método con el, considerar el uso de class_eval con un argumento de cadena y una llamada normal a def:

class_eval <<-EVAL 
    def #{"m"}(a = false) 
    end 
EVAL 

lo contrario sigue la sugerencia en el hilo que filipó a philippe. Ejemplo:

define_method :m do |*args| 
    a = args.first 
end 
+8

Me gusta mucho Ruby. "¿Puedo hacer X?", "¡Sí, X funciona como esperarías!", "¡Horray!" – superluminary

5

Actualmente no es posible due to the yacc parser. This thread on Ruby-forum propone varias soluciones.

class A 
    define_method(:hello) do | name, *opt_greeting| 
     option = opt_greeting.first || Hash.new 
     greeting = option[:greeting] || "hello" 
     puts greeting+" "+name 
    end 
end 


a = A.new 
a.hello "barbara" 
a.hello "Mrs Jones", :greeting => "Good Morning" 
Cuestiones relacionadas