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

15
我有一个接受splat运算符的方法:
def hello(foo, *bar)   
   #... do some stuff 
end
我有一个长度可变的数组,我想将它发送到这个 hello 方法中:
arr1 = ['baz', 'stuff']
arr2 = ['ding', 'dong', 'dang']
我想使用 arr1 和 arr2 作为参数调用这个方法,但是我一直卡在 **bar 被解释为数组而不是单独的参数上。更有趣的是,我不能改变 hello 方法。 我正在寻找与此 SO 问题 类似的 Ruby 解决方案。

1
一些更多的代码将非常有帮助。 - Jacob Relkin
请通过点击最有帮助的答案左侧的空心复选框来接受正确的答案。谢谢! :) - Jacob Relkin
2个回答

15

试着像这样调用它

hello(arr1, *arr2)

这里是在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

通过在第二个数组后添加*,它会将它们视为一个数组而不是一个数组的数组,我想这正是你要找的。


谢谢,那正是发生的事情。即使我在传入参数时调用了 bar.class,我仍然看到了数组。我没有想到它可能是一个数组的数组。 - brycemcd

10

这里是您需要的:

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

方法的最后一个参数可能会在前面加上星号(*),这表示可以传递更多的参数给函数。这些参数将被收集到一个数组中。

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


你为什么更喜欢粘贴截图而不是实际的代码呢? - Mladen Jablanović
@Mladen Jablanovic 没有任何理由,事实上如果您愿意,我可以粘贴代码。 - Jacob Relkin
3
谢谢。我想这只是时间问题,某个人最终会打印出代码,扫描打印的纸张,并将其作为图像附加上去。 :) - Mladen Jablanović
这也是正确的,但我想将数组作为单独的方法调用传递。我已经给这个答案点了赞。 - brycemcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接