数値の階乗を計算する方法を調べると、次のコードに出くわしました。
(1..5).inject(:*) || 1 # => 120
何をしているの(:*) || 1
ですか?
(1..5).inject(1) { |x, y| x * y } # => 120
を使用.inject
して同様の機能を実現するこのコード行と比較してどうですか?
数値の階乗を計算する方法を調べると、次のコードに出くわしました。
(1..5).inject(:*) || 1 # => 120
何をしているの(:*) || 1
ですか?
(1..5).inject(1) { |x, y| x * y } # => 120
を使用.inject
して同様の機能を実現するこのコード行と比較してどうですか?
コロンスター自体は、Ruby では何の意味もありません。これは単なるシンボルinject
であり、列挙可能なメソッドにシンボルを渡すことができます。そのシンボルは、列挙可能な要素で使用されるメソッドまたは演算子を指定します。
例えば:
(1..5).inject(:*) #=> 1 * 2 * 3 * 4 * 5 = 120
(1..5).inject(:+) #=> 1 + 2 + 3 + 4 + 5 = 15
この|| 1
部分は、偽の値をinject
返す場合は代わりに使用されることを意味します。(あなたの例では決して起こりません。)1
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 || 1
1 を返します
絶対に平等です。好みに合わせて、それぞれの方法で使用できます。