2012-02-18 3 views
1

私はメタプログラミングによっていくつかのゲッターを作成しようとしていますが、何らかの理由でうまくいかないようです。私はこれをやっている:シンプルなメタプログラミングいくつかのゲッターを

RESOURCES = %w(wood stone gold) 

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

レールアプリケーションの中で、私は実行時に木製の未定義のメソッドを取得します。なぜどんなアイデア?

(このコードは、Railsの「クラスの市<はActiveRecord ::基本」クラスの中にある)

+0

'RESOURCES' attr_readerする – apneadiving

+0

ちょうど良いだろう内部のより多くのカスタマイズが実際にそこにありますdefine_methodsというリソースは、質問を簡単にするためのものです。しかし、それは私が関連を使っているという事実のために、内部的にはもっと精巧です。しかし、とにかく良い発言。 – Spyros

+0

良い、それはここにコメントとして読むことができるならば知っておかなけれ:) – apneadiving

答えて

1

インスタンスメソッドではなく、クラスメソッドを定義しています。あなたがしようとすると何が起こるか

ウォッチ:

City.wood 
=> "wood" 

あなたはそれがインスタンスメソッドになりたいと仮定:

RESOURCES = %w(wood stone gold) 

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

あなたはクラスメソッドの木ではなく、インスタンスメソッドを定義しています。あなたは、クラス< <自己の外にdefine_method呼び出す場合、あなたはインスタンスメソッドを定義します

City.wood 

を呼び出す必要があります。

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 
関連する問題