1

飲み物を配列に追加するための小さなDSLのようなプログラムを作成しました。これは、クイックプログラムを使用instance_evalおよび作成するための非常に基本的な例です。&block

プログラムは次のとおりです。

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を使用する必要がないように、それ自体を自動復帰させる計画ですadd_drinks.all_drinks。これは可能でしょうか?ありがとう。

4

2 に答える 2

5

配列からDrinksを継承できるため、配列と同様に新しいインスタンスで作業できます

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"] 
于 2012-04-14T14:37:18.113 に答える
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
于 2012-04-14T15:01:40.133 に答える