我们有方法:
def sum(x, y, z)
x + y + z
end
和数组
arr = [1,2,3]
如何将数组传递给sum方法? 其实我需要这样的东西:
pseudo
sum(arr.each {|i| i})
没有改变方法,如果sum接受splat它就能工作,所以请不要提供总和(arr [0],arr [1],arr [2])
答案 0 :(得分:6)
您可以使用splat运算符*
这样做会自动将数组中的每个值分配给相应的命名参数。
sum(*arr)
#=> The above will automagically do
#=> x = arr[0]
#=> y = arr[1]
#=> z = arr[2]
如果传递更多元素,将引发 ArgumentError
。
答案 1 :(得分:0)
作为一种全局方法,您可以创建一个sum方法,使用*
运算符接受数字和数组:
def sum *numbers
numbers.flatten.inject :+
end
它会接受:
sum 1,2,3,4
sum [1,2,3,4]
sum [1,2,3,4],[3,4],8,9
*numbers
是一个数组,包含传递给sum方法的所有参数(该方法不接受的块除外)。这就是*
运营商所做的事情。
#inject method是在可枚举对象上使用的非常方便的快捷方式。