0

たとえば、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)、答えは偽になります。ab

4

3 に答える 3

2

すべての言語がこれを行うわけではありません。C ++は==、オブジェクトを使用して同等性を意味します(ただし==、ポインターを使用すると、参照の同等性を意味します)。私は(完全にはわかりませんが)Dプログラミング言語==は値の平等のために、is演算子は参照の平等のために予約していると信じています。

これは、JavaScriptと他のいくつかの言語の設計上の決定にすぎないと思います。このようにしなければならない理由はありません。

于 2012-05-31T03:48:50.683 に答える
2

すべての言語があなたの説明どおりに機能するわけではありません。たとえば、Pythonでは==平等であり、is参照比較です。

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False
于 2012-05-31T03:53:19.930 に答える
0

ほとんどすべての言語は、参照の平等として平等を実装しています

この質問のタグで示されているようtypesに、多くの言語は型の振る舞いとして平等を実装しています。これは理にかなっています。ほとんどのタイプには、インスタンスのセマンティック「値」を変更せずにインスタンスで変更できるいくつかのプロパティがあります。

だから私が与える答えは次のとおりです。平等は難しいことではありません。どのインスタンスが等しいかを定義するのはタイプ次第です。このような明示的な決定がない場合のデフォルトは、控えめなものにする必要があります。

カスタムタイプを作成する場合は、それを決定する必要があります。言語が継承をサポートしている場合は、それを使用して、「平等はこの他のより基本的なタイプのように動作する必要がある」という決定を表現します。それ以外の場合は、正しい動作をしていると思われる既存の型に対して行われるのと同じように、型に対して明示的に同等性テストをコーディングします。

于 2016-01-31T18:12:04.577 に答える