オブジェクトの同一性と内容の等価性
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/03/10 06:02 UTC 版)
「関係演算子」の記事における「オブジェクトの同一性と内容の等価性」の解説
多くの現代的なプログラミング言語において、オブジェクトやデータ構造は参照を通じてアクセスされる。そのような言語では、2種類の異なる等価性を判定する必要性が生じる: 物理的な(浅い)等価 - 2つの参照が同じオブジェクトを参照しているかどうか 構造的な(深い)等価 - 2つの参照が参照するオブジェクトがある意味において(たとえば内容が同じであるなど)等しいかどうか 通常、前者の等価性は後者の等価性を含意しているが(自身に等しくないような NaN のようなものは除く)、逆は必ずしも真ではない。たとえば、2つの文字列オブジェクトは別個のオブジェクトであるかもしれない(前者の意味では等しくない)が、同じ文字の並びを持ちうる(後者の意味で等しい)。 次の表では、これらの2種類の等価性を判定するための異なる方法を、様々な言語において一覧できるようにしてある。 言語物理的な等価構造的な等価備考C, C++ a == b *a == *b aとbはポインタである C# object.ReferenceEquals(a, b)1 a.Equals(b)1 Common Lisp (eq a b) (equal a b) Java a == b a.equals(b) aとbは参照である OCaml a == b a = b Pascal a^ = b^ a = b Perl $a == $b $$a == $$b $aと$bはスカラーリファレンスである PHP5 N/A $a == $b $aと$bはオブジェクトである Python a is b a == b Ruby a.equal?(b) a == b Scheme (eq? a b) (equal? a b) VB.NET a Is b a = b Objective-C a == b [a isEqual:b] aとbはオブジェクトへのポインタである 1 C# では、参照型に対する == 演算子は既定で ReferenceEquals() メソッドの呼び出しと等価になるが、代わりに Equals() メソッドを実行するように演算子オーバーロードをすることができる。このことによって、構造的な等価性の方がより直感的と思われる型において、== で構造的な等価性を判定するようにできる。特に文字列比較において、このことが効果的である(Java で文字列比較は a.equals(b) と書かなければならないが、C# では a == b と書ける)。
※この「オブジェクトの同一性と内容の等価性」の解説は、「関係演算子」の解説の一部です。
「オブジェクトの同一性と内容の等価性」を含む「関係演算子」の記事については、「関係演算子」の概要を参照ください。
- オブジェクトの同一性と内容の等価性のページへのリンク