4

数値の階乗を計算する方法を調べると、次のコードに出くわしました。

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

何をしているの(:*) || 1ですか?

(1..5).inject(1) { |x, y| x * y } # => 120を使用.injectして同様の機能を実現するこのコード行と比較してどうですか?

4

3 に答える 3

15

コロンスター自体は、Ruby では何の意味もありません。これは単なるシンボルinjectであり、列挙可能なメソッドにシンボルを渡すことができます。そのシンボルは、列挙可能な要素で使用されるメソッドまたは演算子を指定します。

例えば:

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

この|| 1部分は、の値をinject返す場合は代わりに使用されることを意味します。(あなたの例では決して起こりません。)1

于 2013-05-16T06:04:14.297 に答える
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 経由で呼び出すことができます。これは、inject と友人が行っていることです。

その部分については||、左辺が nil または false を返す場合はlhs || 11 を返します

于 2013-05-16T06:13:55.273 に答える
2

絶対に平等です。好みに合わせて、それぞれの方法で使用できます。

于 2013-05-16T06:02:43.840 に答える