使Ruby块返回一个数组?

时间:2012-04-14 14:06:06

标签: ruby block dsl

我已经制作了一个类似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。这可能吗?感谢。

2 个答案:

答案 0 :(得分: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"] 

答案 1 :(得分: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