将数组的元素作为方法调用的参数发送

bry*_*mcd 11 ruby ruby-on-rails

我有一个接受splat运算符的方法:

def hello(foo, *bar)   
   #... do some stuff 
end
Run Code Online (Sandbox Code Playgroud)

我有一个可变长度的数组,我想发送到这个hello方法:

arr1 = ['baz', 'stuff']
arr2 = ['ding', 'dong', 'dang']
Run Code Online (Sandbox Code Playgroud)

我想用arr1和arr2作为该方法的参数来调用该方法,但我不断被挂起,因为*bar被解释为数组而不是单个参数.为了让事情更有趣,我根本无法更改hello方法.

我正在寻找类似于这个问题但在红宝石中的东西.

mpo*_*z08 12

尝试这样称呼它

hello(arr1, *arr2)
Run Code Online (Sandbox Code Playgroud)

这是一个在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
Run Code Online (Sandbox Code Playgroud)

通过将*添加到第二个数组,它将它们视为一个数组而不是一个数组的数组,这是你想要的我认为


Jac*_*kin 8

干得好:

hello('Something', *(arr1 + arr2))
Run Code Online (Sandbox Code Playgroud)

这将组合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"]
Run Code Online (Sandbox Code Playgroud)

方法的最后一个参数可以在前面加一个星号(*),这表示可以将更多参数传递给该函数.收集这些参数并创建数组.

由于最后一个参数被收集到一个数组中,您需要使用*运算符来指示您确实向该方法发送了一个数组,并且它不应该将该参数包装在另一个数组中.

  • 谢谢.我想现在只是时间有人会实际打印代码,扫描打印的纸张并将其作为图像附加.:) (3认同)