2010-01-25 6 views
3

Snippet 1:Quelle est la différence entre ces deux extraits de Ruby?

module A 
    def cm(m,ret) 
    class_eval do 
    define_method(m.to_sym) do 
     return ret 
    end 
    end 
    end 
end 

et de fragment 2:

module B 
    def cm(m,ret) 
    class_eval do 
     "def #{m} #{ret} end" 
    end 
    end 
end 

Les méthodes définies dans ces modules doivent être utilisés pour créer des méthodes d'une classe, qui renvoie certaines valeurs. Voici un exemple:

class Whatever 
    extend A 
    cm("two",2) 
end 

et cela va créer une méthode nommée 2, qui sera de retour 2. La chose est, le code dans le deuxième extrait ne fonctionne pas. Des idées pourquoi? Je pensais que class_eval pourrait prendre une chaîne.

Répondre

5

class_eval prend une chaîne comme argument, mais vous avez transmis la chaîne à la fonction dans un bloc.

Essayez ceci:

module B 
    def cm(m,ret) 
    class_eval("def #{m}() #{ret} end") 
    end 
end 
+0

Je pense toujours que la définition elle-même semble erroné. ne serait-ce pas: "def # {m}; return # {ret}; fin" – Jean

+2

@Jean: Le mot-clé return est facultatif quand l'expression est la dernière de la méthode quand même. Il y a donc un terminateur avant le mot-clé end ou après la liste des arguments d'une définition de méthode. C'est à dire. 'def five() 5 end' est une syntaxe valide. Cependant 'def five 5 end' n'est pas. – sepp2k

Questions connexes