2012年2月28日火曜日

Dartにおける等価比較

このエントリーをはてなブックマークに追加
Dart言語においてオブジェクトが等しいかどうか(等価かどうか)を比較するには、2種類の方法があります。

まずひとつは == 演算子を使う方法。これは左辺オブジェクトの == メソッドを呼び出し、その値によって結果が決まります。Dartでは演算子を自分で再定義(演算子オーバーロード)できますので、これによって == 演算子を使用した時の動作を変更することができます。左辺のオブジェクトが == 演算子をオーバーロードしていない場合は、基底のクラス(何も継承していないクラスならばObjectクラス)にある == メソッドが呼ばれます。

たとえば、あるクラスCが、aとbという2つのint型の値を持っていたとしましょう。しかし == の比較には a しか使用しないとします。この場合のコードは次のようになります。サンプルコード
class C {
  int a_, b_;
  C(this.a_, this.b_) {}
  // a_の値しか比較しない。b_の値は違っていても構わない。
  bool operator==(other) { return this.a_ == other.a_; }
}

main() {
  C one = new C(1, 1);
  C two = new C(1, 2);
  if (one == two) {
    print('one == two');
  } else {
    print('one != two');
  }
}
このコードを実行すると one == two を出力します。operator== をコメントアウトすると Object.== が呼び出され、one != two と表示されるようになります。

もうひとつの比較方法は、=== 演算子を使う方法です。こちらはオブジェクトの参照が等しいかどうかが評価されます。つまり値が同じかどうかではなく、まったく同じオブジェクトかどうかです。サンプルコード
main() {
  Object one = new Object();
  Object two = one;
  if (one === two) {
    print('one === two');
  } else {
    print('one !== two');
  }
}
このコードの実行結果は one === two になります。two の値を new Object(); にすると、結果は one !== two です。

すでに登場していますが、== の結果の真偽値が逆になる演算子は != 演算子で、同様に === の結果が逆になるのは !== 演算子です。

なお、=== 演算子はオーバーロードできません。

0 件のコメント:

コメントを投稿