Ruby:尝试在类定义中动态定义实例方法:为什么使用define_method工作但不使用alias_method?

时间:2012-02-20 15:30:07

标签: ruby oop metaprogramming

我有一个类定义,我希望用简写术语为它的几个属性方法添加别名。例如"价格"到" pr"等等:

以下实施有效:

class Fruit < ActiveRecord::Base
  ABBREVS = {:price=>:pr, :country=>:ct}
  ABBREVS.each_pair{|k,v| define_method(v){ self.send(k) } }
end

然而,define_method看起来太......严厉,对吧?不应该 alias_method 吗?

class Fruit < ActiveRecord::Base
  ABBREVS = {:price=>:pr, :country=>:ct}
  ABBREVS.each_pair{|k,v| alias_method(v, k) }
end

但是当我这样做时,我得到了这种类错误:

NameError: undefined method `price' for class `Fruit'

显然,Ruby认为我试图使用类方法而不是实例方法。我只是在这里使用alias_method错了吗?

1 个答案:

答案 0 :(得分:2)

我猜你正试图别名一个尚未定义的方法。我不知道ActiveRecord的细节,但由于模式没有在代码中定义,但在DB中我怀疑访问器方法直到你第一次到达数据库才能获得模式时才定义 - 这可能是好在你的alias_method电话之后。

但我不认为你应该这样做!只需输入更长的名字!