2012-04-30 11 views
3

私は自己学習のための簡単な小さなテンプレートパーサーを構築しようとしています。サブモジュールとクラス間で変数を共有する

"モジュール式"を構築し、データを共有するにはどうすればよいですか?データは外部からアクセスする必要はなく、内部データだけです。ここで私が持っているものだ:パーサが解決しなければならないので、非常に公開されたメソッドがあるべきではありません

p = TemplateParser.new(html, *args) # or TemplateParser::Base.new(html, *args) 
p.append_css(file_or_string) 
parsed_html = p.parse! 

:Phrogz」はコメント
に基づいて

# template_parser.rb 
module TemplateParser 
    attr_accessor :html 
    attr_accessor :test_value 

    class Base 
    def initialize(html) 
     @html = html 
     @test_value = "foo" 
    end 

    def parse! 
     @html.css('a').each do |node| 
     ::TemplateParser::Tag:ATag.substitute! node 
     end 
    end 
    end 
end 

# template_parser/tag/a_tag.rb 
module TemplateParser 
    module Tag 
    class ATag 
     def self.substitute!(node) 
     # I want to access +test_value+ from +TemplateParser+ 
     node = @test_value # => nil 
     end 
    end 
    end 
end 

編集私は現在のようなものを考えています非一般的な問題であり、移植性がありません。少なくともこの初期段階ではない。私が試みたのは、構造についてノコギリから少しを覗くことでした。あなたが与えてくれたのコード例では

+1

あなたが持っているものを示すことに加えて(それは素晴らしいです)のように見える。公開する方法とクラス(とその理由) – Phrogz

+0

ユーザーフレンドリーなコードに関する私の考えを加えました。 – pduersteler

答えて

2

、私はそうのようなparse!方法にTemplateParser::Baseのインスタンスに渡すために組成物を使用してお勧めします:

# in TemplateParser::Base#parse! 
::TemplateParser::Tag::ATag.substitute! node, self 

# TemplateParser::Tag::ATag 
def self.substitute!(node, obj) 
    node = obj.test_value 
end 

はまたにattr_accessor呼び出しを移動する必要がありますこのためにはBaseクラスが必要です。私はtest_valueへのアクセスの今を考えることができ

module TemplateParser 
    class Base 
    attr_accessor :html 
    attr_accessor :test_value 
    # ... 
    end 
end 

他の方法は、parse!は、異なるクラスのインスタンスの属性にアクセスしようとしているクラスメソッドであることを考えると、かなり複雑になります。

上記は@test_valueTemplateParser::Baseインスタンスごとに一意である必要があると仮定しています。そうでない場合は、クラスまたはモジュールのインスタンス変数を使用してプロセスを単純化できます。

module TemplateParser 
    class Base 
    @test_value = "foo" 
    class << self 
     attr_accessor :test_value 
    end 
    # ... 
    end 
end 

# OR 

module TemplateParser 
    @test_value = "foo" 
    class << self 
    attr_accessor :test_value 
    end 
    class Base 
    # ... 
    end 
end 

その後の実装に応じTemplateParser::Base.test_value OR TemplateParser.test_valueで値を設定または取得します。

また、おそらく明白なことを述べるために、あなたの疑似コードが実際のアプリケーションコードを正確に反映していないと仮定しています。そうであれば、substitute!メソッドは簡単な割り当てを実現する方法について非常にラウンドです。 TemplateParser::Base#parse!の中にnode = test_valueを使用して、往復をスキップしてください。私はあなたがこれを知っていると確信していますが、少なくとも言及する価値があるようでした...

+0

あなたの詳細な例と感嘆のために多くのありがとう。私が提出したコードは、実際には私が起きたいと思っていたものと同じで、擬似的なものではありません。 – pduersteler

関連する問題