Dart中已声明的箭头函数是否属于lambda表达式?
你的理解是完全正确的,核心混淆点其实是很多教程把「箭头语法」和「lambda表达式」两个概念混为一谈了。
我们可以先明确lambda表达式的核心判定标准:核心特征是匿名性,不需要预先绑定固定函数名,可以作为一等值直接传递、赋值给变量或者立即执行。
对应你提到的三种写法:
- 第一种写法
var sqr = (x) => x * x; print(sqr(5));
等号右侧的(x) => x * x本身是没有名称的匿名函数,只是被赋值给了sqr变量,本质属于lambda表达式,只是后续可以通过变量名调用而已。
- 第二种写法
print(((x) => x * x)(5));
这是典型的立即执行匿名函数,全程没有绑定任何固定名称,完全符合lambda表达式的定义。
- 第三种写法
dynamic sqr(dynamic x) => x * x; print(sqr(5));
这只是用箭头语法简化的命名函数,不属于lambda表达式。这里的=>只是Dart提供的普通函数简写,替代了{ return x * x; }的完整写法,和下面的代码完全等价:
dynamic sqr(dynamic x) { return x * x; }
这种写法必须指定函数名sqr,本质是命名的顶级函数/类方法,不具备lambda的匿名核心属性,所以不属于lambda表达式。
内容的提问来源于stack exchange,提问作者Jacob Emery
相关产品推荐
相关产品推荐

