2011-01-10 5 views
60

die Anfänger Frage vergeben, aber sagen, ich habe ein Array:Wie bekomme ich ein Array von Argumenten, wie sende ich diese Argumente an eine bestimmte Funktion in Ruby?

a = [1,2,3] 

und eine Funktion irgendwo; Lassen Sie uns sagen, dass es eine Instanz Funktion:

class Ilike 
    def turtles(*args) 
    puts args.inspect 
    end 
end 

Wie rufe ich Ilike.turtles mit a, als ob ich (Ilike.new).turtles(1,2,3) forderten.

Ich bin vertraut mit send, aber dies scheint ein Array in eine Argumentliste nicht zu übersetzen.

Eine Parallele von dem, was ich suche, ist das Javascript apply, das call entspricht aber das Array in eine Argumentliste konvertiert.

Antwort

113

Wie Sie wissen, können Sie beim Definieren einer Methode die * verwenden, um eine Liste von Argumenten in ein Array umzuwandeln. Ähnlich können Sie beim Aufruf einer Methode das * verwenden, um ein Array in eine Liste von Argumenten umzuwandeln. Also in Ihrem Beispiel können Sie einfach tun:

Ilike.new.turtles(*a) 
+4

Fantastisch. Aufgrund Ihrer ausgezeichneten Antwort habe ich eine ausführlichere Beschreibung dieser Technik in [Wikibooks] (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#Variable_Length_Argument_List.2C_Asterisk_Operator) gefunden. Dies ist in der Tat vollkommen vernünftig, wenn die parallele Notation andersherum geht. Oh, Ruby tatsächlich. Ich habe auch bemerkt, dass Sie Ihre eigenen Argumente ohne peinliches "a.unshift" Zappeln mit 'Ilike.new.turtles (1,2,3, * a)' vorsetzen können, obwohl das Nachpendeln ein solches Manöver zu erfordern scheint. –

+1

@StevenXu In Ruby 1.9 können Sie auch für "Postpending" splat. a = [1,2]; b = [4,5]; p (0, * a, 3, * b, 6) # => "0 \ n1 \ n2 \ n3 \ n4 \ n5 \ n6" ' – Phrogz

+0

Fantastisch beantwortet! – RubyFanatic

Verwandte Themen