web-dev-qa-db-ja.com

Dart文字列コンパレータ

Dartで文字列を比較する最良の方法は何ですか? Stringクラスには、equalsメソッドが含まれていません。 ==推奨ですか?

例えば:

String rubi = 'good';
String ore = 'good';

rubi == ore;
31
Tiago Pertile

はい、 ==は、2つの文字列が等しいかどうかをテストする方法です(同じ文字シーケンスのみを含む)。コードの最終行はtrueと評価されます。

35

文字列は不変オブジェクトです。つまり、文字列を作成することはできますが、変更することはできません。もちろん、他の文字列から新しい文字列を作成することもできますが、一度作成すると、文字列の内容は固定されます。

これは最適化です。同じ文字が同じ順序である2つの文字列は同じオブジェクトになる可能性があるためです。

String rubi = 'good';
String ore = 'good';

print(rubi == ore); // true, contain the same characters
print(identical(rubi, ore)); // true, are the same object in memory
6

Javaとは異なり、 Dart==などの演算子をオーバーライドできます。したがって、この演算子に独自のテストを定義して、等しいかどうかを確認できます。 indentical function を使用して、2つの参照が同じオブジェクト(Javaのオブジェクトに対する==と同等)を参照しているかどうかを確認することもできます。

String sの場合、これは少し特殊です。 String をどのようにインスタンス化するかに応じて、DartVMで異なる結果を得ることができます。

main() {
  final s = "test";

  printTests(s, "test");
  // displays '==' => true    'identical' => true

  printTests(s, "$s");
  // displays '==' => true    'identical' => false

  printTests(s, new String.fromCharCodes(s.codeUnits));
  // displays '==' => true    'identical' => false
}

printTests(String s1, String s2) {
  print("'==' => ${s1 == s2}    'identical' => ${identical(s1, s2)}");
}

ご覧のとおり、identicalは最初のケースでのみtrueを返し、==は常にtrueを返します。しかし、それは常に正しいとは限りません。 Dart2jsコンパイル後にJavaScriptでこのコードを実行すると、identicalおよび==は常にtrueを返します。

ほとんどの場合、参照ではなく文字列の値を比較するため、==を使用する必要があります。

5