2012-04-14 9 views
1

私は、飲み物をアレイに追加するための小さなDSLのようなプログラムを作った。これは、instance_eval&blockを使用してクイックプログラムを作成するためのかなり基本的な例です。ここでRubyブロックで配列を返すようにしますか?

は、プログラムの:

class Drinks 
    def initialize(&block) # Initialize drinks 
    @drinks = [] 
    instance_eval &block 
    end 

    def drink(d) 
    @drinks << d 
    end # Add drink 

    def all_drinks 
    puts @drinks 
    end 

end 

add_drinks = Drinks.new do 
    drink "water" 
    drink "soda" 
    drink "juice" 
end 

add_drinks.all_drinks 

計画はあなたがadd_drinks.all_drinksを使用する必要はありませんのでadd_drinksオートリターン自体を作ることです。これは可能でしょうか?ありがとう。

+0

"自動返却する"?しかし、それはあなたが望むものではありません、あなたは配列をしたいですか? –

答えて

5

あなたはあなたがオブジェクトが何であるか、それがどのように動作するかを再考したい場合があります配列

class Drinks < Array 
    def initialize(&block) # Initialize drinks 
    instance_eval &block 
    end 

    def drink(d) 
    self << d 
    end # Add drink 
end 

add_drinks = Drinks.new do 
    drink "water" 
    drink "soda" 
    drink "juice" 
end 

add_drinks # => ["water", "soda", "juice"] 
+1

これは話題にはなりませんが、問題を修正してコードを簡潔にするために役立ちました。なぜなら、理由はわかりませんが、 'instance_eval'コンストラクタ内のイニシャライザの内部ではなく、イニシャライザの内部にあります。 – Thermatix

1

のように新しいインスタンスで動作することができますので、あなたは、アレイからのドリンクを継承することができます。おそらくこれは次のようになります:

class Drinks 
    def initialize(&block) 
    @drinks = [] 
    instance_eval &block 
    end 

    def add(d) 
    @drinks << d 
    end 

    def show 
    puts @drinks 
    end 
end 

drinks = Drinks.new do 
    add "water" 
    add "soda" 
    add "juice" 
end 

drinks.show 
関連する問題