dynamically - ruby define method
¿Cómo especificar el argumento predeterminado del método usando define_method? (2)
define_method
podría usarse para definir métodos:
define_method(:m) do |a|
end
que es equivalente a lo siguiente:
def m(a)
end
Sin embargo, ¿cuál es la forma equivalente de lo siguiente utilizando define_method
:
def m(a=false)
end
Tenga en cuenta que necesitaría poder llamar a m()
sin dar ningún argumento.
Esto no es posible actualmente debido al analizador yacc . Este hilo en 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"
Esto realmente funciona como lo esperarías en Ruby 1.9.
define_method :m do |a = false|
end
Si necesita compatibilidad con 1.8, pero no necesariamente necesita un cierre para definir su método, considere usar class_eval
con un argumento de cadena y una llamada regular a def
:
class_eval <<-EVAL
def #{"m"}(a = false)
end
EVAL
De lo contrario, siga la sugerencia en el hilo al que se vinculó philippe. Ejemplo:
define_method :m do |*args|
a = args.first
end