4

查找如何计算我遇到此代码的数字的阶乘:

(1..5).inject(:*) || 1 # => 120

(:*) || 1做什么?

(1..5).inject(1) { |x, y| x * y } # => 120它与用于.inject实现类似功能的这行代码相比如何?

4

3 回答 3

15

Colon-star 本身在 Ruby 中没有任何意义。它只是一个符号,您可以将符号传递给inject可枚举的方法。该符号命名要在可枚举元素上使用的方法或运算符。

所以例如:

(1..5).inject(:*) #=> 1 * 2 * 3 * 4 * 5 = 120
(1..5).inject(:+) #=> 1 + 2 + 3 + 4 + 5 = 15

|| 1部分表示如果inject返回false值,1则改为使用。(在你的例子中这永远不会发生。)

于 2013-05-16T06:04:14.297 回答
3

测试.rb:

def do_stuff(binary_function)
  2.send(binary_function, 3)
end

p do_stuff(:+)
p do_stuff(:*)

$红宝石测试.rb

5

6

如果您将方法名称作为符号传递,则可以通过 send 调用它。这就是inject 和朋友们正在做的事情。

关于该||部分,如果左侧返回nil或false,lhs || 1将返回1

于 2013-05-16T06:13:55.273 回答
2

这是绝对平等的。您可以根据自己的口味使用每种方式。

于 2013-05-16T06:02:43.840 回答