2010-03-23 2 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 

당신은했으나, 당신이 원하지 않는 to define_method의 인수에 메소드의 인수를 포함 시키십시오. 인수는 define_method에 전달하는 블록으로 이동합니다. 당신은 하나 개의 클래스/모듈 내부 필요 Shoertly 경우

1

: 나는 해시를 사용하지만 당신은 등 요소

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) } 
의이 배열을 넣을 수 있습니다
관련 문제