with method dynamically define_method define ruby

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