【问题标题】:Obscure Dart syntax晦涩的 Dart 语法
【发布时间】:2013-11-11 13:20:49
【问题描述】:

在处理Dart Route library example for client side coding 时,我遇到了这个sn-p。

 var router = new Router()
    ..addHandler(urls.one, showOne)
    ..addHandler(urls.two, showTwo)
    ..addHandler(urls.home, (_) => null)
    ..listen();

我的问题是(_) => null 是如何工作的?似乎指定了一个返回空值的函数,但(_) 是什么意思?

【问题讨论】:

  • 这是必需的函数参数。参数命名为“_”,因为它没有被使用。这是相同的“..addHandler(urls.home, (myUnusedArgumentThatINotWantUse) => null)”。 “null”表示您的函数返回 null。这种构造称为“函数表达式”。您构造没有语句的函数。或者更准确地说,只有一个语句称为 epression 语句。在我们的例子中,“null”是 epression 语句。这是声明直接返回表达式的函数的简短形式。这里的“null”也表示“返回null”。

标签: dart


【解决方案1】:

(_) 表示它是一个有一个参数的函数,但你并不关心那个参数,所以它就被命名为_。你也可以写(ignoreMe) => null。这里重要的是,需要有一个接受一个参数的函数。你用它做什么,就是你的事。

【讨论】:

  • 如果 printNumber(number) => print('The number is $number.'); 是在常规 dart 语法中声明函数的方式,那么函数不应该像 _(a)=>null 这样吗?
  • 我还应该问 () 是否是没有参数的函数的简写?
  • 无参数函数“() => null”或 void 函数“() {}”的简写。但是“(_) => null”不是简写。因为这与拉丁字母表中的 "(x) => null" 和其他选项相同。这是这个“(x) { return null; }”的short form
【解决方案2】:

(_) => null 表示:一个函数,它接受一个名为_ 的参数并返回null。它可以看作是(iDontCareVariable) => null 的快捷方式。

没有参数的类似函数是() => null

具有更多参数的类似函数是(_, __, ___) => null

请注意,_ 不是在语言级别定义的特殊语法。它只是一个可以在函数体内使用的变量名。例如:(_) => _.

【讨论】:

  • 我一直在避免使用“匿名”这个词,但也许我应该在我的问题中使用它。函数可以有名字吗?我知道命名一个永远不会使用名称的函数似乎毫无意义,但 () 似乎是指示函数的错误选择,因为括号是分组运算符,可能会在更复杂的表达式中发生冲突。将标识符放在括号前面可以更容易从编译器/解释器的角度识别。
  • 我只是想了一些。从技术上讲,完整的表达式是()=>{expression} 而不仅仅是()
  • 如果你定义了一个函数returnNull(_) => null;你可以在..addHandler(urls.home, returnNull)中使用它
【解决方案3】:

我将尝试通过示例来解释这一点。

void main() {
  var helloFromTokyo = (name) => 'こんにちわ $name';
  var greet = new Greet();      
  greet.addGreet('London', helloFromLondon)
  ..addGreet('Tokyo', helloFromTokyo)  
  ..addGreet('Berlin', helloFromBerlin)
  ..addGreet('Mars', (_) => null)
  ..addGreet('Me', (name) => 'Privet, chuvak! You name is $name?')
  ..addGreet('Moon', null);

  greet.greet('Vasya Pupkin');
}

String helloFromLondon(String name) {
  return 'Hello, $name';
}

String helloFromBerlin(String name) {
  return 'Guten tag, $name';
}

class Greet {
  Map<String, Function> greets = new Map<String, Function>();

  Greet addGreet(String whence, String sayHello(String name)) {
    greets[whence] = sayHello;
    return this;
  }

  void greet(String name) {
    for(var whence in greets.keys) {
      var action = greets[whence];
      if(action == null) {
        print('From $whence: no reaction');
      } else {
        var result = action(name);
        if(result == null) {
          print('From $whence: silent');
        } else {
          print('From $whence: $result');
        }
      }
    }
  }
}

输出:

From London: Hello, Vasya Pupkin
From Tokyo: こんにちわ Vasya Pupkin
From Berlin: Guten tag, Vasya Pupkin
From Mars: silent
From Me: Privet, chuvak! You name is Vasya Pupkin?
From Moon: no reaction

【讨论】:

  • 这很有用,但我想我要问的是:() 是没有参数的未命名函数的简写吗?
  • 这个回答你的主要问题“我的问题是 () => null 是如何工作的?它似乎指定了一个返回 null 值的函数,但是 ()什么意思?”
  • 另一个可以添加的小例子是var helloFromTokyo = (name) =&gt; 'Konnichiwa $name';。这样你就可以在当前函数内部而不是外部引用这个匿名函数。你(@Emmentaler)似乎对 Java 很熟悉;它在 Java 8 中看起来几乎相同:docs.oracle.com/javase/tutorial/java/javaOO/…
  • @KayZ 你的例子被接受为var helloFromTokyo = (name) =&gt; 'こんにちわ $name';
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2016-03-02
相关资源
最近更新 更多