2012-02-18 24 views
1

我試圖通過元編程來創建一些getters,但由於某種原因它似乎不工作。我這樣做:Simple Metaprogramming一些getters

RESOURCES = %w(wood stone gold) 

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

在一個rails應用程序,但我得到一個木未定義的方法,執行時。任何想法爲什麼?

(該代碼是Rails「級市<的ActiveRecord :: Base的」類中)

+0

'attr_reader RESOURCES'會就好了 – apneadiving 2012-02-18 10:48:30

+0

有實際上更多的定製內部define_methods,資源就在那裏使問題變得更簡單。但由於我使用關聯這一事實,它在內部更加精細。但無論如何,好評如潮。 – Spyros 2012-02-18 11:09:05

+0

好,疑難雜症:) – apneadiving 2012-02-18 11:10:32

回答

1

您正在定義類方法,而不是實例方法。

觀看當您嘗試會發生什麼:

City.wood 
=> "wood" 

假設你希望它是一個實例方法:

RESOURCES = %w(wood stone gold) 

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

你定義一個類的方法木材,而不是一個實例方法。你會需要調用

City.wood 

如果調用define_method類< <自我之外,你會被定義實例方法。

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