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
的类型为void
、null
或dynamic
,则有例外,但您的类型没有)。
因为人们非常喜欢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 函数 - 箭头语法冲突的主要内容,如果未能解决你的问题,请参考以下文章