2011-02-06 2 views
0
NAMES = ['orange', 'pear'] 

    Fruit.class_eval do 
    NAMES.each do |n| 
     define_method "is_#{n}?" do 
      self.name == Fruit.find_by_name(n) 
     end 
    end 
    end 

과일 개체의 경우 과일 개체의 이름 속성과 같이 오렌지인지 아닌지 여부를 명시 적으로 묻고 싶습니다. Fruit.find_by_name ('orange')를 호출하면 is_orange? 나는 거짓말을한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?인스턴스 프로그래밍 방식을 메타 프로그래밍 - 문법에 문제가 있습니까?

+1

나는 ['instance_eval'] (http://ilikestuffblog.com/2009/01/09/fun-with-rubys-instance_eval-and-class_eval/)을 사용해야한다고 생각합니다. – meagar

+0

당신의 방법 호출 중입니다. 따라서 잘못이 아니라 메타 프로 그램 내에서의 논리가됩니다. ActiveRecord (?)를 생각해 보시겠습니까? – Phrogz

답변

1
self.name == Fruit.find_by_name(n) 

이 나에게 잘못되었습니다. 확인해야할까요

self.name == n 

??

그리고 실제로 instance_eval을 사용해야합니다.

또한 나는 당신의 방법 이름을 오렌지색으로하는 것이 더 루비 같은 것이라고 생각합니까? is_orange 대신에?

+0

ok, instance_eval은 묻는 질문에 대해 의미가 있습니다 만, 단순히 클래스 내부의 메소드를 정의하는 것이 더 합리적이지 않습니까? – tokland

관련 문제