简单的Metaprogramming一些吸气剂

时间:2012-02-18 04:20:48

标签: ruby-on-rails ruby ruby-on-rails-3

我试图通过元编程创建一些getter,但由于某种原因它似乎不起作用。我这样做:

RESOURCES = %w(wood stone gold)

class << self
    RESOURCES.each do |resource|
        define_method "#{resource}" do
            resource
        end
    end
end     

在rails应用程序中,但是在执行时我获得了一个未定义的木头方法。有什么想法吗?

(该代码在Rails“class City&lt; ActiveRecord :: Base”类中)

2 个答案:

答案 0 :(得分:1)

您正在定义类方法wood,而不是实例方法。你需要打电话

City.wood

如果你在类之外调用define_method&lt;&lt; self,您将定义实例方法。

class City < Object
  RESOURCES = %w(wood stone gold)
  RESOURCES.each do |resource|
    define_method "#{resource}" do
      resource
    end
  end  
end
city = City.new
puts city.wood

答案 1 :(得分:1)

您正在定义类方法,而不是实例方法。

观察尝试时会发生什么:

City.wood
=> "wood"

假设您希望它是一个实例方法:

RESOURCES = %w(wood stone gold)

RESOURCES.each do |resource|
    define_method "#{resource}" do
        resource
    end
end