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

您可以从 Array 继承 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 回答