Wie sende ich diese Argumente bei einer Reihe von Argumenten an eine bestimmte Funktion in Ruby?

70

Verzeihen Sie die Anfängerfrage, aber sagen Sie, ich habe ein Array:

a = [1,2,3]

Und irgendwo eine Funktion; Nehmen wir an, es ist eine Instanzfunktion:

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

Wie rufe ich Ilike.turtlesmit , aals ob ich anrufen (Ilike.new).turtles(1,2,3).

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

Eine Parallele zu dem, was ich suche, ist das Javascript apply, das calldem Array entspricht, es aber in eine Argumentliste konvertiert.

Steven
quelle

Antworten:

130

Wie Sie wissen, können Sie beim Definieren einer Methode *eine Liste von Argumenten in ein Array umwandeln. Wenn Sie eine Methode aufrufen, können Sie mit der *Option ein Array in eine Liste von Argumenten umwandeln. In Ihrem Beispiel können Sie also einfach Folgendes tun:

Ilike.new.turtles(*a)
sepp2k
quelle
4
Fantastisch. Aufgrund Ihrer hervorragenden Antwort habe ich in Wikibooks eine ausführlichere Darstellung dieser Technik gefunden . Dies ist angesichts der parallelen Notation, die in die andere Richtung geht, durchaus sinnvoll. Oh, Ruby in der Tat. Mir ist auch aufgefallen, dass Sie Ihre eigenen Argumente ohne umständliches a.unshiftZappeln voranstellen können Ilike.new.turtles(1,2,3,*a), obwohl das Nachstellen ein solches Manöver zu erfordern scheint.
Steven
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
Fantastisch beantwortet!
RubyFanatic
Dies ist eine lustige Technik:some_func(*'some string of args'.split)
Dennis Williamson