查看如何计算数字的阶乘,我遇到了这段代码:
(1..5).inject(:*) || 1 # => 120
(:*) || 1
在做什么?
与使用(1..5).inject(1) { |x, y| x * y } # => 120
实现类似功能的代码行.inject
相比如何?
答案 0 :(得分:15)
Colon-star本身并不代表Ruby中的任何内容。它只是一个symbol,您可以将符号传递给可枚举的inject
方法。该符号命名要在可枚举元素上使用的方法或运算符。
所以例如:
(1..5).inject(:*) #=> 1 * 2 * 3 * 4 * 5 = 120
(1..5).inject(:+) #=> 1 + 2 + 3 + 4 + 5 = 15
|| 1
部分表示如果inject
返回falsey值,则会使用1
。 (在你的例子中哪个永远不会发生。)
答案 1 :(得分:3)
test.rb:
def do_stuff(binary_function)
2.send(binary_function, 3)
end
p do_stuff(:+)
p do_stuff(:*)
$ ruby test.rb
5
6
如果您将方法名称作为符号传递,则可以通过send调用它。这就是注入和朋友正在做的事情。
关于||
部分,如果左侧返回nil或false,lhs || 1
将返回1
答案 2 :(得分:2)
绝对平等。您可以根据自己的喜好使用各种方式。