Dartで同じオブジェクトであるかの確認をする
Dartでシングルトンのクラスを見ている時に、インスタンスが同じオブジェクトであるかどうかを確認してみたくなりました。
Rubyだと、obj1.equal?(obj2)
でチェックができます。
'Ruby'.equal? 'Ruby' # => false
もしくは、オブジェクトIDを取得してみてもいいですね。
(実行ごとに結果は変わります)
'Ruby'.object_id # => 70314180894460 'Ruby'.object_id # => 70314180920120
Dartではidentical
というメソッドで比較できます。
class Person { String name; Person(this.name); } void main () { final alice = Person('Alice'); print(identical(alice, Person('Alice'))); // => false }
ただ、Dartでは==
演算子の比較でオブジェクトが等しいかどうかを見ているそうです。
以前は===
演算子もあったけれど、なくなったよう。
final alice = Person('Alice'); print(alice == Person('Alice')); // => false
intクラスの==
に、デフォルトの挙動と、overrideする際の注意点が記載してありました。
(雰囲気訳)
全てのオブジェクトはデフォルトでthis
とother
が同じオブジェクトの時にtrue
を返します。
==
をoverrideすることで、classに異なる等値関係を指定できます。overrideしたメソッドは等値関係を示していなければなりません。
ただし、クラスによっては挙動が違うようで、Stringは文字コードの並びが一致しているかどうかを見ているようです。
print('Amelie' == 'Amelie'); // => true print('Am\xe9lie'); // => Amélie print('Ame\u{301}lie'); // => Amélie print('Am\xe9lie' == 'Ame\u{301}lie'); // => false
逆に、違うオブジェクトでも値が同じだったら同じとみなす、というpackageを作っている人もいました。
これも便利そう!
言語によってオブジェクトの比較の仕様が違って面白いですね。
以上、Dartのオブジェクトの比較でした!