2012-11-19 4 views
1

내가 배열에 문자열 요소를 사용하는 방법을 정의하고 싶습니다 예 :문자열을 메서드 이름으로 어떻게 사용합니까?

ARRAY = ["name1", "name2"] 
ARRAY.each do |k| 
    def k? 
    self.attribute == k 
    #or whatever else in here 
    end 
end 

다음 작업을 수행 할 수 있도록 :

article.name1? #would return true of article.attribute == "name1" 

이 가능한 같은가요?

분명히 이것은 내가 할 수있는 한 가지 간단한 예일뿐입니다.하지만 실제로 여기에서 설명하는 것은 문자열을 기반으로 메소드 이름을 지정하는 방법입니다.

답변

5

Module#define_method이 필요합니다. 이것을 확인해보십시오 :

class Foo 
    attr_accessor :attribute 

    ARRAY = ["name1", "name2"] 
    ARRAY.each do |k| 
    define_method "#{k}?" do 
     self.attribute == k 
    end 
    end 
end 

f = Foo.new 
f.attribute = 'name1' 

f.name1? # => true 
f.name2? # => false 
0

U 이것을 달성하기 위해 define_method (메타 프로그래밍)를 사용할 수 있습니다.

%w(name1 name2).each do |meth| 
    define_method(meth) { self.attribute == k } 
    end 
+0

작은 샘플을 통해 설명하는 방법을 설명해야합니다. –

관련 문제