2011-02-06 10 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

関連する問題