2010-01-12 3 views

Répondre

44

Cela fonctionne exactement comme vous le feriez dans Ruby 1.9!

define_method :m do |a = false| 
end 

Si vous avez besoin 1.8 compatibilité, mais vous ne pas nécessairement besoin d'une fermeture pour définir votre méthode avec, pensez à utiliser class_eval avec un argument de chaîne et un appel régulier à def:

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

Dans le cas contraire suivez la suggestion dans le fil auquel philippe est lié. Exemple:

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

J'aime beaucoup Ruby. "Puis-je faire X?", "Oui, X fonctionne comme vous l'espériez!", "Horray!" – superluminary

5

Ceci n'est actuellement pas possible due to the yacc parser. This thread on Ruby-forum propose plusieurs solutions.

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" 
Questions connexes