2010-12-29 10 views
10

私はスプラットオペレータ受け入れ方法があります。メソッド呼び出しの引数として配列の要素を送信

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

私はこのhelloメソッドに送りたい可変長の配列を持っているが:

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

私は、そのメソッドの引数としてARR1とARR2を持つメソッドを呼び出すしたいのですが、私は代わりに、個々の引数の配列として解釈されていること*バーにハングアップ得続けます。物事を楽しくするために、私はhelloメソッドをまったく変更できません。

私はthis SO questionと似たようなものを探していますが、ルビーにあります。この

hello(arr1, *arr2) 

のようにそれを呼び出す

+1

さらに多くのコードが役に立ちます。 –

+0

最も役立つ回答の左にある中空のチェックマークをクリックして、あなたの質問に正解を受け入れてください。ありがとう! :) –

答えて

11

試みがここで二番目の配列に*を追加することにより、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 

で通るのです、それは代わりに配列として扱います配列の配列、これはあなたが探しているものだと思う。

+0

ありがとう、それはまさに何が起こっていたのですか。渡された引数に 'bar.class'を呼び出したとしても、私は配列を見ていました。私はそれが配列の配列かもしれないとは思わなかった。 – brycemcd

8

ここに行く:

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

これはarr1arr2アレイを組み合わせて、集合的に方法の上の第二の引数からそれらを通過します。

例:

>> 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"] 

方法の最後のパラメータは、アスタリスク(*)が先行してもよく、これは、より多くのパラメータが関数に渡されてもよいことを示しています。これらのパラメーターは収集され、配列が作成されます。

最後のパラメータは配列に集められているので、*演算子を使用して、実際に配列をメソッドに送信し、引数を別の配列にラップしないことを示す必要があります。

+0

実際のコードの代わりにスクリーンショットを貼り付けることをお勧めする理由は何ですか? –

+0

@Mladen Jablanovic全く理由はありませんが、実際には私がコードに貼り付けることを好みます。 –

+3

ありがとうございます。誰かが実際にコードを印刷し、印刷した紙をスキャンしてイメージとして添付するのは時間の問題だと思う。 :) –