2011-01-10 12 views
60

Wybacz początkujących pytanie, ale muszę powiedzieć tablicy:Biorąc pod uwagę szereg argumentów, jak wysłać te argumenty do konkretnej funkcji w Ruby?

a = [1,2,3] 

i funkcję gdzieś; powiedzmy, że jest to funkcja instancja:

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

Jak mogę powołać Ilike.turtles z a jakbym dzwoniąc (Ilike.new).turtles(1,2,3).

Jestem zaznajomiony z send, ale to nie wydaje się tłumaczyć tablicy na listę argumentów.

Równolegle z tym, czego szukam, jest Javascript apply, który jest równoważny z call, ale przekształca tablicę na listę argumentów.

Odpowiedz

113

Jak wiesz, kiedy definiujesz metodę, możesz użyć *, aby zamienić listę argumentów w tablicy. Podobnie, gdy wywołasz metodę, możesz użyć tablicy *, aby przekształcić tablicę w listę argumentów. Więc w twoim przykładzie możesz po prostu zrobić:

Ilike.new.turtles(*a) 
+4

Fantastyczny. W oparciu o twoją doskonałą odpowiedź, znalazłem bardziej dokładny opis tej techniki w [Wikibooks] (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#Variable_Length_Argument_List.2C_Asterisk_Operator). Jest to całkowicie uzasadnione, biorąc pod uwagę równoległy zapis przechodzący w drugą stronę. Och, naprawdę Ruby. Zauważyłem również, że możesz przedkładać własne argumenty bez kłopotliwego "a.unshift", wiercąc się przy użyciu "Ilike.new.turtles" (1,2,3, * a) ", chociaż postpending wydaje się wymagać takiego manewru. –

+1

@StevenXu W Ruby 1.9 można również splatować po "postpending". "a = [1,2]; b = [4,5]; p (0, * a, 3, * b, 6) # => "0 \ n1 \ n2 \ n3 \ n4 \ n5 \ n6" ' – Phrogz

+0

Fantastycznie odpowiedział! – RubyFanatic

Powiązane problemy