有一个linter规则,它验证在重写的==操作符中没有检查空相等。规则是这里。
我理解这条规则,但看不出它是如何在技术上实现的。在这种情况下,Dart本身似乎对other != null进行了一些隐式检查,==返回false。这是正确的吗?
在其他语言(例如Java )中,需要在重写的equals中显式添加此检查。
第二个问题是为什么它不自动检查other的类型。为什么不让我作为一个程序员检查null,但我仍然需要检查是否other is Person?是否存在重写==并在那里检查其他类型,然后检查该类类型的情况?
发布于 2020-11-04 19:44:25
linter规则实现很简单,它只检查是否将operator ==的参数与null进行比较。您不需要这样做的原因是,Dart中的e1 == e2被定义为首先将e1和e2计算为一个值,然后如果其中一个或两个值都是null,则提前给出结果,而只有在其他情况下,它才会调用e1值上的operator==方法。因此,当调用该方法时,您肯定知道该参数不是null。
==操作符在调用operator==方法之前不进行更多检查的原因是有些例子可能是错误的。特别是,int和double可以是相等的。拥有不同类的实例可能是相等的,这是您所认为的更常见的(代理、模拟、包装器、笛卡儿点与极地点、int与double)。
另一种可能的早期检查是说一个对象等于它自己,所以是if (identical(this, other)) return true;,但是有一个反例被强加在语言上: NaN,又名。double.nan。这个特定的“值”并不等于它本身(这违反了==的自反性要求,而是由IEEE-754标准指定的,这是CPU自己实现的)。如果不是NaN,那么在调用operator==之前,该语言可能也会检查身份。
发布于 2020-11-04 18:03:08
在这种情况下,Dart本身似乎对
other != null进行了一些隐式检查,==返回false。这是正确的吗?
是。
第二个问题是为什么它不自动检查
other的类型。为什么不让我作为一个程序员检查null,但我仍然需要检查是否other is Person?是否存在重写==并在那里检查其他类型,然后检查该类类型的情况?
这种情况不太常见,但在某些情况下,您可能希望在等式的右侧允许另一种类型。例如,左手边和右手边可以很容易地相互转换或转换成一种普通的类型。假设您创建了一个Complex数字类,并且希望Complex(real: 4.0, imaginary: 0.0) == 4为真。
发布于 2020-11-04 16:28:45
从医生那里:
没有一个类可以等效为空。
意思是,当other is Person为真时,other != null也为真。这是因为:
空对象是内置类
Null的唯一实例。
(https://dart.dev/guides/language/spec)
因此,每个实例对任何类型进行检查,但Null将返回null的false
class A {}
void main() {
final x = null;
final a = A();
print(x is Null); // true
print(x is A); // false
print(a is Null); // false
print(a is A); // true
} https://stackoverflow.com/questions/64683566
复制相似问题