2011-07-19 10 views
1

私を助けてください。多くのクラスで同じ属性の束を使用しています

多くのクラスで同じ属性の属性を使用する必要があります。私は事前に定義された属性を持つモジュールを作成し、すべてのクラスで

module Basic 
@a=10 
end 

class Use 
extend Basic 
def self.sh 
    @a 
end 
end 

puts Use.sh 

をこのモジュールを拡張することをお勧めしますが、出力は空です。私は何かを逃したようです。

おそらくもっと良い方法がありますか?

あなたの考えは?

答えて

1

それはall about the selfです:基本的に評価する

module Basic 
    @a=10 
end 

ていself。あなたは後者が延長されたとき、それはUseに評価したい:

module Basic 
    # self = Basic, but methods defined for instances 
    class << self 
    # self = Basic's eigenclass 
    def extended(base) 
     base.class_eval do 
     # self = base due to class_eval 
     @a=10 
     end 
    end 
    end 
end 

class Use 
    # self = Use, but methods defined for instances 
    extend BasiC# base = Use in the above 
    class << self 
    # self = Use's eigenclass 
    def sh 
     @a 
    end 
    end 
end 

Use.sh # 10 
+0

もう1つ質問していただきありがとうございます。拡張(ベース)が実際に何を意味するのか分かりません。私にリンクを与えることができますか?ありがとう! – com

+0

[extended()](http://www.ruby-doc.org/core/classes/Module.html#M000459)は[included()]のようなものです(http://www.ruby-doc.org /core/classes/Module.html#M000458):これは 'extends Basic'を使うときに起きるモジュールメソッドです(' Basic.extend(Use) 'を呼び出します)。 'included()'は 'include Basic'を使うときに始まります。 –

0

何を記述していることはフライ級のデザインパターンです。 Ruby(http://designpatternsinruby.com/section02/flyweight.html)でほとんど使われていないものもありますが、他のものは実装を提供しています(http://www.scribd.com/doc/396559/gof-patterns-in-rubyページ14)

個人的には、これらの属性をすべてyamlファイルに入れて、変数:

ATTRIBUTES = YAML.load_file(File.expand_path( 'attributes.yml'、File.dirname(FILE))

たり、変更されませんと仮定し、ここでのキャッシングとクラスメソッド(、アプリが実行されている間にymlファイルが新しい値を必要としている)。私はActiveSupport::Concernをここで使用することをお勧めします。クラスメソッドでの従来の混合方法:

module Basic 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def attributes_file 
     File.expand_path('attributes.yml', File.dirname(__FILE__)) 
    def attributes 
     @attributes ||= YAML.load_file(attributes_file) 
     @attributes 
    end 
    end 

    module InstanceMethods 
    # define any here that you need, like: 
    def attributes 
     self.class.attributes 
    end 
    end 
end 

各属性のメソッドを定義したり、属性ハッシュにインデックスを付けることができます。また、空の状態になり、method_missingを定義してその名前の属性が存在するかどうかを確認することで、共有構成に属性を追加したいときにメソッドを追加する必要がなくなります。

+0

値を変更し、更新された値をクラス間で共有したい場合は、おそらくシングルトンが最適な方法でしょう。 –

関連する問題