【问题标题】:dart function - arrow syntax conflictiondart 函数 - 箭头语法冲突
【发布时间】:2021-04-24 09:18:18
【问题描述】:

1。 Dart Language tour 有冲突

在功能部分,它说

=> expr 语法是 { return expr; 的简写; }。

注意:箭头 (=>) 和分号 (;) 之间只能出现表达式,而不是语句。例如,您不能在其中放置 if 语句,但可以使用条件表达式。

但在匿名函数部分,它说

如果函数只包含一个语句,你可以使用箭头符号来缩短它

这是否意味着我可以在匿名函数中使用不是表达式的语句(例如 if 语句)?

var fun = () => return 3; // However, this doesn't work.
var gun = () {
  return 3;               // this works.
}

或者我混淆了表达和陈述的概念?我以为

  • 表达式:可以计算为一个值(2 + 3,print('') 也属于表达式)
  • 语句:可以执行的代码。所有表达式都可以是语句。 if 语句和 return 语句是非表达式语句的示例。

2。这是表达式还是语句

void foo() => true; // this works.
void goo() {
  return true;      // this doesn't work.
}
void hoo() {
  true;             // this works.
}

如果将true理解为表达式,那么它就意味着返回true,我认为它不应该起作用,因为foo的返回类型是void。

那么是不是意味着 foo 中的 true 被理解为一个语句?但这个结论与 Dart Language Tour 相矛盾。 (它们是顶级命名函数)。此外,这意味着我们可以使用带箭头语法的语句。


我使用来自 Flutter 的 VSCode 和 Dart:1.22.5。我根据 VSCode 错误消息告诉代码有效的代码和无效的代码。

因为这是我的第一个问题,对于我简短的英语和格式错误的问题,我深表歉意。

【问题讨论】:

  • 我认为“如果函数只包含一个语句,您可以使用箭头符号缩短它”是在随意而不是技术意义上使用“语句”。 => 需要右侧的表达式。确实可以缩短带有return 3; 的单个语句的函数;缩写形式为=> 3。在实践中,很少(但并非不可能)拥有一个不能缩短的语句的函数。

标签: dart syntax


【解决方案1】:

它必须是一个表达式。文字具有误导性。

对于第二部分,您看到的错误

void foo() {
  return 0;
}

而不是与

void bar() => 0;

是返回void 的函数中=>特殊情况。通常,您不能从返回类型为void 的函数返回,因此没有return exp;,只有return;。 (如果exp 的类型为voidnulldynamic,则有例外,但您的类型没有)。

因为人们非常喜欢void foo() => anything; 的简写符号,所以无论anything 是什么类型,你都可以这样做。这就是void foo() { return 0; }void foo() => 0; 之间存在区别的原因。它们的意思仍然相同,但前者的基于类型的错误在后者中被刻意抑制了。

【讨论】:

  • 我找到了一份文件说明了这一点。它的上下文是 about=> e(其中 e 是一个表达式)。特别是,当返回类型为 void 时,e 可以具有任何类型。这使得 void 函数的简洁声明成为可能。理解这样的函数相当容易,因为返回类型在文本上接近返回的表达式 e。来自 Dart 编程语言规范第 5 版草案,版本 2.2。 2019.07.29.
【解决方案2】:

我猜匿名函数下那部分的作者有点困惑。提出问题,并纠正它!

是的,即使在他们的示例中,他们也使用了 print() 函数,他们可能会混淆为打印“语句”,但显然不是。

【讨论】:

  • 很高兴听到您对第二个问题的看法,因为我无法将 foo 解释为表达式。
  • 至于第二个问题,我猜Object => void 不能字面意思是“返回无效”,所以它只是解决了,文本对文本等价作为一个块子程序不匹配。我不会称其为语言缺陷,因为它以这种方式工作非常方便。 :)
  • @WBN true 是一个表达式。 return true; 是一个声明。 true; 是具有一个表达式的语句,但该表达式的结果被忽略。 void foo() => true; 为方便起见;否则使用=> 来缩短返回void 的函数会很尴尬。
猜你喜欢
  • 2018-06-08
  • 1970-01-01
  • 2017-08-15
  • 2017-03-05
  • 2023-02-22
  • 2017-10-14
  • 1970-01-01
  • 2018-06-15
  • 2018-01-29
相关资源
最近更新 更多