2012-04-14 10 views
1

Ich habe ein kleines DSL-ähnliches Programm zum Hinzufügen von Getränken zu einem Array gemacht. Es ist ein ziemlich einfaches Beispiel für die Verwendung von instance_eval und &block, um ein schnelles Programm zu erstellen.Einen Ruby-Block erstellen ein Array zurückgeben?

Hier ist das Programm:

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 

Der Plan ist add_drinks Auto-Rückkehr selbst zu machen, damit Sie müssen add_drinks.all_drinks nicht verwenden. Wäre das möglich? Vielen Dank.

+0

"automatisch zurückgeben"? Aber das ist nicht was du willst, du willst das Array? –

Antwort

5

Sie können Getränke von Array erben, so können Sie wie bei Array

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

Ich weiß, das ist nicht im Thema, aber ich möchte nur sagen, dass dies half mir, ein Problem zu beheben und machen meinen Code weniger wortreich + einfacher so danke, ich weiß nicht warum, aber ich habe nicht die 'instance_eval' innerhalb des Initialisierers und dann außerhalb davon im Konstruktor also danke. – Thermatix

1

Sie mögen vielleicht zu überdenken, was das Objekt mit neuer Instanz arbeiten ist und wie es sich verhält. Vielleicht tun Sie es so:

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