Dartで文字列を比較する最良の方法は何ですか? Stringクラスには、equals
メソッドが含まれていません。 ==
推奨ですか?
例えば:
String rubi = 'good';
String ore = 'good';
rubi == ore;
はい、 ==
は、2つの文字列が等しいかどうかをテストする方法です(同じ文字シーケンスのみを含む)。コードの最終行はtrue
と評価されます。
文字列は不変オブジェクトです。つまり、文字列を作成することはできますが、変更することはできません。もちろん、他の文字列から新しい文字列を作成することもできますが、一度作成すると、文字列の内容は固定されます。
これは最適化です。同じ文字が同じ順序である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
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
を返します。
ほとんどの場合、参照ではなく文字列の値を比較するため、==
を使用する必要があります。