2010-03-23 50 views
13

我用了很多重复的在我的模型来定义方便的方法,这样的东西:使用define_method动态定义setter方法?

PET_NAMES.each do |pn| 
define_method(pn) do 
... 
... 
end 

,但我从来没有能够动态地定义setter方法,即:

def pet_name=(name) 
... 
end 

使用define_method像这样:

define_method("pet_name=(name)") do 
... 
end 

任何想法?提前致谢。

回答

37

这里是您用来扩展您的类模块中使用define_method的一个相当完整的例子:

module VerboseSetter 
    def make_verbose_setter(*names) 
    names.each do |name| 
     define_method("#{name}=") do |val| 
     puts "@#{name} was set to #{val}" 
     instance_variable_set("@#{name}", val) 
     end 
    end 
    end 
end 

class Foo 
    extend VerboseSetter 

    make_verbose_setter :bar, :quux 
end 

f = Foo.new 
f.bar = 5 
f.quux = 10 

输出:

 
@bar was set to 5 
@quux was set to 10 

你接近,但你不希望在调用define_method的参数中包含该方法的参数。参数传入define_method

1

Shoertly如果你需要它一类/模块内: 我使用散列但你可以把有元素等

PETS = { 
    "cat" => "meyow", 
    "cow" => "moo", 
    "dog" => "ruff" 
} 

def do_smth1(v) 
... 
end 

def do_smth(sound,v) 
... 
end 

#getter 
PETS.each{ |k,v| define_method(k){ do_smth1(v) } } 

#setter 
PETS.each{ |k,v| define_method("#{k}="){|sound| do_smth2(sound, v) } 
的阵列
相关问题