Ruby array eval作为方法的参数

时间:2015-04-09 04:15:28

标签: ruby-on-rails ruby

我们有方法:

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

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是在可枚举对象上使用的非常方便的快捷方式。