2010-12-29 11 views
10

Mam metodę, która akceptuje operatora ikona:Wysyłanie elementy tablicy jako argumenty wywołania metody

def hello(foo, *bar) 
    #... do some stuff 
end 

Mam tablicę o zmiennej długości, które chciałbym wysłać do tego sposobu powitania :

arr1 = ['baz', 'stuff'] 
arr2 = ['ding', 'dong', 'dang'] 

Chciałbym wywołać metodę z arr1 i ARR2 jako argumenty do tej metody ale wciąż otrzymuję rozłączyła się w tym barze * jest interpretowane jako tablicę zamiast poszczególnych argumentów. Żeby było fajniej, nie mogę w ogóle zmienić metody hello.

Szukam czegoś podobnego do this SO question, ale w rubinie.

+1

Jeszcze więcej kodu byłoby bardzo pomocne. –

+0

Zaakceptuj prawidłowe odpowiedzi na pytania, klikając wewnątrz pustego znaczka wyboru po lewej stronie najbardziej przydatnej odpowiedzi. Dzięki! :) –

Odpowiedz

11

spróbować nazywając go jak ten

hello(arr1, *arr2) 

tu jest prowadzony przez w IRB

irb(main):002:0> def hello(foo, *bar) 
irb(main):003:1> puts foo.inspect 
irb(main):004:1> puts bar.inspect 
irb(main):005:1> end 
=> nil 
irb(main):006:0> arr1 = ['baz', 'stuff'] 
=> ["baz", "stuff"] 
irb(main):007:0> arr2 = ['ding', 'dong', 'dang'] 
=> ["ding", "dong", "dang"] 
irb(main):008:0> hello(arr1, arr2) 
["baz", "stuff"] 
[["ding", "dong", "dang"]] 
=> nil 
irb(main):009:0> hello(arr1, *arr2) 
["baz", "stuff"] 
["ding", "dong", "dang"] 
=> nil 

przez dodanie * do drugiej tablicy, traktuje je jako tablicy zamiast tablica tablicy, której szukamy, myślę, że

+0

dziękuję, właśnie to się działo. Nawet gdy nazwałem 'bar.class' na przekazanych argumentach, widziałem tablicę. Nie sądziłem, że może to być tablica tablicy. – brycemcd

8

Tutaj jesteś:

hello('Something', *(arr1 + arr2)) 

To będzie łączyć arr1 i arr2 tablice i przekazać je wspólnie z drugim argumentem do tej metody.

przykład:

>> def hello(str, *args) 
>> puts str 
>> args.each do |arg| 
?> puts 'Splat: ' + arg 
>> end 
>> end 
=> nil 
>> hello('Hello', *(['programming'] + ['is', 'fun'])) 
Hello 
Splat: programming 
Splat: is 
Splat: fun 
=> ["programming", "is", "fun"] 

ostatni parametr w sposobie może być poprzedzona gwiazdką (*), oznacza to, że parametrów mogą być przekazywane do funkcji. Te parametry są gromadzone i tworzona jest tablica.

Ponieważ ostatnie parametry są gromadzone w tablicy, należy użyć operatora *, aby wskazać, że rzeczywiście wysyłamy tablicę do metody i że nie powinna ona owijać argumentów w innej tablicy.

+0

Każdy powód, dla którego wolisz wklejać zrzuty ekranu zamiast rzeczywistego kodu? –

+0

@ Mladen Jablanovic Nie ma żadnego powodu, w rzeczywistości, jeśli wolisz, wkleję kod. –

+3

Dzięki. Sądzę, że to tylko kwestia czasu, kiedy ktoś wydrukuje kod, zeskanuje wydrukowany papier i załączy go jako obraz. :) –

Powiązane problemy