Ruby中的“:*”(冒号星)是什么意思?

时间:2013-05-16 05:53:24

标签: ruby

查看如何计算数字的阶乘,我遇到了这段代码:

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

(:*) || 1在做什么?

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

3 个答案:

答案 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)

绝对平等。您可以根据自己的喜好使用各种方式。