2013-05-17 4 views
7

だから、私はちょうどその代わりのような書き込みの事を知っている:Rubyが新しい表記法を理解しようとしています。 ((注入:)対を選択(&:偶数); 1が&持っている理由は?)

[1,2,3,4,5].inject {|x,y| x + y} => 15 

私は書くことができ

[1,2,3,4,5].inject(:+) => 15 

は、私はまた、代わりに

[1,2,3,4,5].select {|x| x.even?} => [2,4] 

を書くの私が書くことができることを学んだ

[1,2,3,4,5].select(&:even?) => [2,4] 

私の質問は、1つ(選択)が&を使用し、もう1つ(注入)が使用しない理由です。 :は、even?+がシンボルで扱われていると確信していますが、なぜ&が1つで使用され、なぜ:が使用されるのかを明確にしたいと思います。

さらに、injectselect以上でこれらの表記を行うことができます。

多くの感謝!

答えて

10

&この場合、演算子はシンボルをprocに変換します。だから、コードは、このフードの下ん:inject方法の

[1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4] 

実装は、これらのショートカットメソッドの仕様の必要性を認識し、シンボルをパラメータとして渡されたときのために特別な処理を追加します。したがって、この場合、基本的には&演算子が実行します。

なぜ1(選択)&を使用し、他の一つは(注入)誰もがselectこのように実装されません

んので。 Rubyはオープンソースなので、あなたのパッチを受け入れることさえできます。移動して、これを修正してください:)

P .:しかし、それが私に任せていたら、注射の特別な処理を削除します。 Symbol#to_proc(それは&オペレータが使用しているものです)の存在下で少し冗長で混乱しているように感じます。

+0

を参照してください。非常に、非常に興味深い! Rubyでは、私が選択したように、多くのことが非常に簡単であることがわかりました。あなたは前に進み、 '{| elem | elem.send:even?} 'これは本質的に私のブロックがバックグラウンドでやっていることですか?その形式に変わって、何をしようとしているのですか? Rubyでさまざまなやり方で行うことができます。私は興味がある。 – David

+0

@David:はい、それは 'select(&:even?)'がフードの中で何をするのかです。 –

+1

@Davidは本当に質問に答えるならば、答えを受け入れることを忘れないでください! – vgoff

関連する問題