将`_`(即下划线)作为Dart语言函数的唯一参数传递是什么意思?

Eth*_*han 26 syntax dart

我正在学习Dart并且看到以下习语:

someFuture.then((_) => someFunc());

我也见过像这样的代码:

someOtherFuture.then(() => someOtherFunc());

这两个例子之间是否存在功能差异?Aka,_作为参数传递给Dart函数有什么作用?

鉴于Dart _用作声明私有函数的前缀,这尤其令人困惑.

谢谢.

Zec*_*umo 36

它是一个_通常命名的变量,因为您打算不使用它并扔掉它.例如,您可以使用名称xfoo替代.(_)和之间的区别()很简单,一个函数接受一个参数而另一个函数不接受参数.

  • 我正在研究 Dart,并认为语言设计者决定使用约定而不是对成员可见性等内容强加语法,这是很糟糕的。“惯例”就像“传说”,通过流言蜚语而不是结构而生存。我还认为单引号的“首选”使用是可悲的,但那是针对不同的线程的。 (3认同)
  • 1)它不是传递垃圾,只是没有被使用。2) `null` 是一个关键字,不能用作变量名。3) 是的,它可以节省打字时间,而且外观低调。4) 不,`_` 是一个已赋值的变量。这里没有什么惊喜。 (2认同)

Cop*_*oad 8

下划线 ( _) 通常表示您不会在块中使用此参数。这只是一种编写代码的巧妙方法。

假设我有一个带有两个参数的方法useful,并且useless我没有useless在代码块中使用:

void method(int useful, int useless) {
  print(useful);
}
Run Code Online (Sandbox Code Playgroud)

由于useless不会使用变量,我应该将上面的代码编写为:

void method(int useful, int _) { // 'useless' is replaced with '_'
  print(useful);
}
Run Code Online (Sandbox Code Playgroud)


Hri*_*dam 5

来自 Dart 文档 - PREFER 使用___等来表示未使用的回调参数。

有时回调函数的类型签名需要参数,但回调实现不使用该参数。在这种情况下,习惯上将未使用的参数命名为 _。如果函数有多个未使用的参数,请使用额外的下划线以避免名称冲突:_____等。

futureOfVoid.then((_) {
  print('Operation complete.');
});
Run Code Online (Sandbox Code Playgroud)

本指南仅适用于匿名函数和本地函数。这些函数通常在明确未使用参数代表什么的上下文中立即使用。相反,顶级函数和方法声明没有该上下文,因此必须命名它们的参数,以便清楚每个参数的用途,即使不使用它。

将以下代码复制粘贴到DartPad中并点击运行 -

void main() {
  
  Future.delayed(Duration(seconds: 1), () {
    print("No argument Anonymous function");
  });
  
  funcReturnsInteger().then((_) {
    print("Single argument Anonymous function " + 
    "stating not interested in using argument " +
    "but can be accessed like this -> $_");
  });
}

Future<int> funcReturnsInteger() async {
  return 100;
}
Run Code Online (Sandbox Code Playgroud)