dart 函数 - 箭头语法冲突

Posted

技术标签:

【中文标题】dart 函数 - 箭头语法冲突【英文标题】:dart function - arrow syntax confliction 【发布时间】: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。在实践中,很少(但并非不可能)拥有一个不能缩短的语句的函数。 【参考方案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 解释为表达式。 顺便提一下,归档github.com/dart-lang/site-www/issues/2878 至于第二个问题,我猜Object => void 不能字面意思是“返回无效”,所以它只是解决了,文本对文本等价作为一个块子程序不匹配。我不会称其为语言缺陷,因为它以这种方式工作非常方便。 :) @WBN true 是一个表达式。 return true; 是一个声明。 true; 是具有一个表达式的语句,但该表达式的结果被忽略。 void foo() => true; 为方便起见;否则使用=> 来缩短返回void 的函数会很尴尬。

以上是关于dart 函数 - 箭头语法冲突的主要内容,如果未能解决你的问题,请参考以下文章

FlutterDart的方法与箭头函数

掌握如何让函数更好地调用

掌握如何让函数更好地调用

掌握如何让函数更好地调用

2Es常用语法 箭头函数类

除了语法,普通函数和箭头函数有啥区别吗? [复制]