2017-04-15 1 views
2

Est-il possible de déclarer des méthodes dynamiques avec define_method qui fait un instance_exec d'un bloc avec des arguments? Quelque chose comme ceci:Créer une méthode dynamique qui prend l'argument

class D 
    def self.adapt (method,*args,&impl) 
    define_method(method) do 
     instance_exec(args,impl) 
    end 
    end 
end 

D.adapt(:foo,a,b) { a + b } 

puts D.new.foo(1,2) 
+0

S'il vous plaît indente votre code avec deux espaces :) –

+1

Il est fait, désolé ^^ – tomatediabolik

Répondre

5

Oui, vous pouvez:

class D < Struct.new(:c) 
    def self.adapt (method, &impl) 
    define_method(method) do |*args| 
     instance_exec(*args, &impl) 
    end 
    end 
end 

D.adapt(:foo) { |a, b| a + b + c } 

puts D.new(3).foo(1, 2) 
# => 6 
+0

Pourquoi est-il nécessaire de sous-classe de 'Struct.new (: c)'? –

+0

Ce n'est pas le cas. C'est pour montrer que le bloc donné à 'D.adapt' peut accéder aux variables d'instance de' D'. – Gaston

+0

Fonctionne comme un charme, merci beaucoup! – tomatediabolik