たとえば、Javascriptでは、[1,2,3] === [1,2,3]
両方[1,2,3] == [1,2,3]
ともfalseです。空の配列のより単純なケースも誤りです。その理由は、配列は参照型であり[1,2,3]
、[1,2,3]
参照として異なるためです。Javascriptはこの点で一意ではなく、整数などの最も基本的な型や一部の組み込み型を除いて、ほとんどすべての言語が参照の同等性として同等性を実装しています。
なぜそうなのですか?デフォルトの等式演算子をより強力にするのは何が難しいのでしょうか。では、参照を比較するだけでなく、構造特性も比較するのが難しいのはなぜですか?
多くの言語は、特定の演算子をオーバーロードして他の何かを意味する機能を提供していることを知っています。これ==
は、通常の弱参照の等式ではなく、意味したいことを意味します。[1,2,3] == [1,2,3]
私の質問は、言語がそのような機能を提供するかどうかではなく、デフォルトの等式演算子がデフォルトでtrueと評価され、プログラマーの介入を必要としないほど賢明なものではない理由です。
Pythonでは、上記の例はtrueと評価されますが、次のクラスを定義すると
class A:
def __init__(self, prop):
self.prop = prop
次に比較a = A(1)
すると、構造的には同じであり、オブジェクトを定義するビットパターンだけがわかっている場合は、それらを区別する方法はありませんがb = A(1)
、答えは偽になります。a
b