首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >avoid_null_checks_in_equality_operators linter规则的澄清

avoid_null_checks_in_equality_operators linter规则的澄清
EN

Stack Overflow用户
提问于 2020-11-04 16:03:12
回答 3查看 60关注 0票数 0

有一个linter规则,它验证在重写的==操作符中没有检查空相等。规则是这里

我理解这条规则,但看不出它是如何在技术上实现的。在这种情况下,Dart本身似乎对other != null进行了一些隐式检查,==返回false。这是正确的吗?

在其他语言(例如Java )中,需要在重写的equals中显式添加此检查。

第二个问题是为什么它不自动检查other的类型。为什么不让我作为一个程序员检查null,但我仍然需要检查是否other is Person?是否存在重写==并在那里检查其他类型,然后检查该类类型的情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-04 19:44:25

linter规则实现很简单,它只检查是否将operator ==的参数与null进行比较。您不需要这样做的原因是,Dart中的e1 == e2被定义为首先将e1e2计算为一个值,然后如果其中一个或两个值都是null,则提前给出结果,而只有在其他情况下,它才会调用e1值上的operator==方法。因此,当调用该方法时,您肯定知道该参数不是null

==操作符在调用operator==方法之前不进行更多检查的原因是有些例子可能是错误的。特别是,intdouble可以是相等的。拥有不同类的实例可能是相等的,这是您所认为的更常见的(代理、模拟、包装器、笛卡儿点与极地点、intdouble)。

另一种可能的早期检查是说一个对象等于它自己,所以是if (identical(this, other)) return true;,但是有一个反例被强加在语言上: NaN,又名。double.nan。这个特定的“值”并不等于它本身(这违反了==的自反性要求,而是由IEEE-754标准指定的,这是CPU自己实现的)。如果不是NaN,那么在调用operator==之前,该语言可能也会检查身份。

票数 2
EN

Stack Overflow用户

发布于 2020-11-04 18:03:08

在这种情况下,Dart本身似乎对other != null进行了一些隐式检查,==返回false。这是正确的吗?

是。

第二个问题是为什么它不自动检查other的类型。为什么不让我作为一个程序员检查null,但我仍然需要检查是否other is Person?是否存在重写==并在那里检查其他类型,然后检查该类类型的情况?

这种情况不太常见,但在某些情况下,您可能希望在等式的右侧允许另一种类型。例如,左手边和右手边可以很容易地相互转换或转换成一种普通的类型。假设您创建了一个Complex数字类,并且希望Complex(real: 4.0, imaginary: 0.0) == 4为真。

票数 1
EN

Stack Overflow用户

发布于 2020-11-04 16:28:45

从医生那里:

没有一个类可以等效为空。

意思是,当other is Person为真时,other != null也为真。这是因为:

空对象是内置类Null的唯一实例。

(https://dart.dev/guides/language/spec)

因此,每个实例对任何类型进行检查,但Null将返回nullfalse

代码语言:javascript
复制
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
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64683566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档