我正在练习红宝石注射方法,发现了一个奇怪的输出:
def adding(*num)
res = num.inject{|sum,n| sum + n}
puts "sum:::::::::::::::::::#{res.inspect}"
puts "sum:::::::::::::::::::#{res.class}"
end
adding ([1,2,3,4,5])
输出:
sum:::::::::::::::::::[1, 2, 3, 4, 5]
sum:::::::::::::::::::Array
当我们这样做的时候:
[1,2,3,4,5].inject{|sum,n| sum + n}
输出:
15
为什么这个奇怪的输出?在方法调用中,添加([1,2,3,4,5]),它也应该返回15。
这种奇怪输出的原因是什么?
答案 0 :(得分:4)
num
不是您认为的那样。
def adding(*num)
num # => [[1, 2, 3, 4, 5]]
end
adding([1,2,3,4,5])
要么不做splat
def adding(num)
或单独传递数字
adding(1, 2, 3, 4, 5)
答案 1 :(得分:2)
制作一个这样的方法,它可以接收数组或内联数字列表:
def adding(*num)
num.flatten.inject { |sum,n| sum + n }
end
*num
表示法意味着参数被放入数组中,即使它们已经一个数组,也会导致无意的嵌套。
现在,当以下列方式之一调用时,这将起作用:
adding(1, 2, 3)
adding([ 1, 2, 3 ])
它还将处理疯狂的事情:
adding([ [ 1 ], [ [ 2 ], [ [ 3 ] ] ] ])
那是因为flatten
会紧缩并消除任何嵌套结构。