Dartで文字列を比較する最良の方法は何ですか? equals
String クラスにはメソッドが含まれていません。==
推奨されますか?
例えば:
String rubi = 'good';
String ore = 'good';
rubi == ore;
Dartで文字列を比較する最良の方法は何ですか? equals
String クラスにはメソッドが含まれていません。==
推奨されますか?
例えば:
String rubi = 'good';
String ore = 'good';
rubi == ore;
文字列は不変オブジェクトです。つまり、文字列を作成することはできますが、変更することはできません。もちろん、他の文字列から新しい文字列を作成することもできますが、一度作成すると、文字列の内容は固定されます。
これは最適化です。同じ文字を同じ順序で持つ 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 関数を使用して、2 つの参照が同じオブジェクトへのものであるかどうかを確認することもできます ( Java==
のon オブジェクトに相当します)。
Stringの場合、少し特殊です。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)}");
}
ご覧のとおり、最初の case とalwaysのみがidentical
返されます。しかし、それは必ずしも真実ではありません。dart2jsのコンパイル後にこのコードを JavaScript で実行すると、常に.true
==
true
identical
==
true
ほとんどの場合、参照ではなく String の値を比較する必要があるため、 を使用する必要があります==
。