【问题标题】:Shorthand of checking the nullability of a bool variable used in an if condition检查 if 条件中使用的 bool 变量的可空性的简写
【发布时间】:2021-05-30 12:40:27
【问题描述】:
Future<bool?> f() async => true;

void main() async {
  final proceed = await f();
  if (proceed) {...} // Error
  if (proceed != null && proceed) {...} // Works but too verbose
}

是否有任何速记或更好的方法来代替写长的proceed != null &amp;&amp; proceed 支票?我知道我可能遗漏了一些如此微不足道的东西。

注意:我知道可以为proceed 提供默认值,但这不是我的用例。如果 bool 实际上不是 null,Bang 运算符可以做到这一点。

【问题讨论】:

    标签: dart dart-null-safety


    【解决方案1】:

    听起来像是您可以使用?? 运算符的情况,该运算符记录在语言导览中: https://dart.dev/guides/language/language-tour#conditional-expressions

    它将允许您将长 if 语句重写为:

    if (proceed ?? false) {...}
    

    ?? 在这里表示我们要使用proceed 的值,只要它不是null。对于null,我们希望使用false 作为值。

    这样做的一个缺点是,与之后将 proceed 提升为不可为空的类型相比,Dart 似乎没有对 proceed 进行任何类型提升:

    if (proceed != null && proceed) {...}
    

    不确定是否存在 Dart 问题。

    【讨论】:

    • 您好,感谢您的回答。但我已经知道if (proceed ?? false) 部分,并且我在帖子中也提到过,“我知道可以提供一个默认值来继续”。我想我应该选择if (proceed != null &amp;&amp; proceed)
    • 我确实发现if (proceed != null &amp;&amp; proceed) 更易于阅读,但if (proceed ?? false) 可能是大多数人会使用的,即使对于布尔值也是如此。推荐使用 proceed == true,因为后者看起来像是一个错误。它和(proceed != null &amp;&amp; proceed) 一样有效,因为proceed ?? false 真的意味着(proceed != null ? proceed : false)
    • @lrn 你对proceedif (proceed ?? false) 之后缺少类型提升到不可空有什么看法?这是应该发生的事情吗?如果场景对分析器来说有点奇怪,我可以理解。
    • 我认为它应该可以工作,我会提交错误以找出为什么它不能与(proceed != null ? proceed : false) 完全相同。
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-11-02
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多