2010-05-22 4 views
2

attr_reader 메서드와 비슷한 Ruby에서 return_empty_set 클래스 메서드를 사용하고 싶습니다.Ruby 메타 프로그래밍에서 class_eval 피하기

class Foo 
    return_empty_set :one 
end 
Foo.new.one # returns #<Set: {}> 

하지만, 캐릭터에 의존하는 것은 매우 해킹처럼 보인다 : 내 제안 된 구현은

class Class 
    def return_empty_set *list 
    list.each do |x| 
     class_eval "def #{x}; Set.new; end" 
    end 
    end 
end 

예를 사용합니다. 이것을 작성하는 더 깨끗한 방법이나 더 좋은 방법이 있습니까, 아마도 class_eval을 피해야할까요? 아니면 이것이 최선의 방법입니까?

답변

6

사용 define_method :

class Module 
    def return_empty_set *names 
    names.each do |name| 
     define_method(name){Set.new} 
    end 
    end 
end 
+0

우수, 감사합니다. 그리고 당신 말이 맞아요.이 모듈은'Module' 아래에 있어야합니다. 그때부터이 기능을'include '할 수 있기 때문입니다. – Peter

+0

그게 무슨 뜻인지 모르겠지만,'Module'에 넣는 이유는'Module' 정의 (나중에 포함될 것입니다)와'Class' '안에있을 때 사용할 수 있다는 것입니다. –

+0

예, 그것이 내가 의미했던 것입니다. – Peter

관련 문제