10

デビッド・A・ブラックは著書の中で次のように述べています。

[T]条件付き代入演算子||=と、めったに見られないいとこの &&= は、どちらも疑似演算子メソッドと同じ種類のショートカットを提供しますが、オーバーライドできない演算子||andに基づいています。&&

||なぜ彼は、 andをオーバーライドできないと具体的に述べたの&&ですか?

4

1 に答える 1

12

論理的に動作がクラスに依存する可能性があるオブジェクトの他の演算子とは異なり、ブール演算子は言語の一部です。たとえば、のような演算子がある場合、==この演算子の動作はオブジェクトのタイプに依存すると言うのが論理的です。文字列は文字ごと、ハッシュキー値タプルごとにキー値タプルなどをチェックする必要があります。ただし、&&およびの動作は言語のtrueとfalseの定義に||基づいており、オブジェクト固有のものではありません。言語でこれらの演算子をオーバーライドできる場合、一貫したブールモデルが存在しない可能性があり、これらの演算子は完全に役に立たなくなります。

さらに、パフォーマンスに関する考慮事項もあります。&&||短い回路演算子であるため、たとえば、の最初の引数が&&falseと評価された場合、2番目の引数も評価されません。を使用||すると、最初の評価がtrueの場合、2番目の評価は行われません。Ruby演算子はメソッドとしてオーバーロードされるため、これらの演算子をオーバーライドできる場合、この動作は不可能です。また、メソッドを呼び出す前に、定義上、すべてのパラメーターを評価する必要があります。そのため、短絡オペレータのパフォーマンスの向上とプログラミングの利便性が失われます。

于 2013-03-09T14:23:40.277 に答える