函数调用前的感叹号是啥意思?

Posted

技术标签:

【中文标题】函数调用前的感叹号是啥意思?【英文标题】:What does the exclamation mark mean before a function call?函数调用前的感叹号是什么意思? 【发布时间】:2020-11-24 21:53:04 【问题描述】:

我在关注 Flutter 的 PR 时遇到了这段代码:

if (chunkCallback != null) 
  chunkCallback!(0, 100);

chunkCallback后面的感叹号是什么意思?我在 Google 上搜索的内容均无效。

【问题讨论】:

也可以写成chunkCallback?.call(0, 100); 谁投了反对票,如果你能解释一下,那会更有帮助,因为我可以改进我的问题。谢谢! 是的@lrn,这实际上是在 PR 中提出的,但我的问题是关于“!”。不过感谢您的建议! if 语句不是已经将 chunkCallback 的类型更改为在花括号内不可为空吗? 【参考方案1】:

"!" 是一个新的 dart 运算符,用于将 nullable 类型转换为 non-nullable 类型。 阅读 here 和 here 了解声音空值安全性。

仅在您绝对确定该值永远不会为 null 并且不要将其与 conditional property access 运算符混淆时才使用它。

【讨论】:

如果方法为 null 并且我使用“!”调用它运营商,应用程序可能会崩溃。有没有办法安全地调用这个方法? @JAHelia 是的,检查可能包含该方法的变量是否不等于 null 正如@user13315601 的回答中提到的,您在谷歌上搜索的术语是“null-assertion-operator”【参考方案2】:

chunkCallback 是对函数的可为空引用。

如果您确定 chunkCallback 在运行时不能为空,您可以通过添加 ! 来“消除可空性”以使编译器满意

typedef WebOnlyImageCodecChunkCallback = void Function(
    int cumulativeBytesLoaded, int expectedTotalBytes);

...

class Class1 
  final WebOnlyImageCodecChunkCallback? chunkCallback;

  Class1(this.chunkCallback);

  void test() 
    if (chunkCallback == null) 
      throw Exception("chunkCallback is null");
    

    chunkCallback!.call(0, 100);
  

本质上,! 在这种情况下是一个语法糖

(chunkCallback as WebOnlyImageCodecChunkCallback).call(0, 100);

【讨论】:

终于有了一个理智、简洁、易懂的描述。【参考方案3】:

我认为这是“消除可空性”的简写语法,根据文档:https://dart.dev/null-safety/understanding-null-safety#null-assertion-operator

【讨论】:

以上是关于函数调用前的感叹号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

函数前的感叹号有啥作用?

函数名后面的感叹号是啥意思?

python里面forward和right是啥意思

函数签名中变量名前的 * 和 ** 是啥意思? [复制]

delphi中函数的声明和调用是啥意思?

main函数是(唯一)被操作系统显式调用的函数。这里的显式调用是啥意思。