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