2011-02-06 46 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 2011-02-06 15:28:43

+0

你可以很容易地验证你的方法正在被调用。因此,这不是错误的元编程,而是你的逻辑。检查你的ActiveRecord(?)思考 – Phrogz 2011-02-06 15:34:16

回答

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

对我来说似乎是错的。你不应该检查

self.name == n 

??

而且你应该确实使用instance_eval。

另外,我认为它会更像红宝石般的命名你的方法橙色?而不是is_orange ?.