为什么ruby注入方法不返回方法中的和

时间:2016-12-11 20:35:20

标签: ruby

我正在练习红宝石注射方法,发现了一个奇怪的输出:

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。

这种奇怪输出的原因是什么?

2 个答案:

答案 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会紧缩并消除任何嵌套结构。