【发布时间】:2013-04-21 18:14:35
【问题描述】:
在 Dart 中比较字符串的最佳方法是什么? String 类不包含equals 方法。推荐==吗?
例如:
String rubi = 'good';
String ore = 'good';
rubi == ore;
【问题讨论】:
-
我意识到将生成的字符串作为变量放在引号中时可以很好地进行比较
'$rubi' == '$ore';
标签: dart
在 Dart 中比较字符串的最佳方法是什么? String 类不包含equals 方法。推荐==吗?
例如:
String rubi = 'good';
String ore = 'good';
rubi == ore;
【问题讨论】:
'$rubi' == '$ore';
标签: dart
是的,== 是测试两个字符串是否相等(仅包含相同的字符序列)的方法。代码的最后一行计算结果为 true。
【讨论】:
字符串是不可变的对象,这意味着您可以创建它们但不能更改它们。你当然可以用其他字符串构建一个新的字符串,但是一旦创建,字符串的内容就固定了。
这是一种优化,因为两个相同字符的字符串,顺序相同,可以是同一个对象。
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
【讨论】:
=== 已替换为内置函数identical()。
与 Java 不同,Dart 允许覆盖 == 等运算符。因此,您可以为此运算符定义自己的测试来检查相等性。您还可以使用indentical function 来检查两个引用是否指向同一个对象(在Java 中的对象上相当于==)。
对于Strings,有点特别。根据您实例化 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。
在大多数情况下,您想要比较 String 的值而不是它们的引用,因此您应该使用 ==。
【讨论】:
(为了完整起见,这里是比较两个字符串的另一种方法。)
Dart 中的String 实现了Comparable 接口。您可以使用compareTo 来比较字符串。
String rubi = 'good';
String ore = 'good';
rubi.compareTo(ore) == 0;
您需要检查 NULL 值。
【讨论】:
有几种方法可以比较字符串。根据您的需要,您应该选择合适的解决方案:
【讨论】: