2012-04-14 36 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自動返回本身,所以你不必使用add_drinks.all_drinks。這可能嗎?謝謝。

+0

「auto-return itself」?但那不是你想要的,你想要數組? – 2012-04-14 14:34:31

回答

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 2015-10-21 16:17:22

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