Dart函数与高阶函数语法及使用场景疑问咨询
Dart高阶函数语法与场景解析
本人无软件开发背景,目前正在学习Dart语言及高阶函数,对以下代码中各函数的语法(分号、大括号使用规则)以及每个函数的适用场景存在困惑:
void main(List<String> args) { print(duplicate(5)); print(duplicate2(10)); print(duplicate3()(20)); print(duplicate4()(30)); print(duplicate5()(40)); print(duplicate8(50)); } Function duplicate = (int x) { return x * 2; }; //Fat Arrow syntax of duplicate, OK. Function duplicate2 = (int y) => y * 2; Function duplicate3() { return (int z) => z * 2; } Function duplicate4() { return duplicate3(); } Function duplicate5() { return duplicate; } /* ERROR, WHY? Same with duplicate4. Function duplicate6() { Function duplicate7() { return (int a) => a * 2; } } */ //Regular Function int duplicate8(int a) { return a * 2; }
一、核心语法规则(分号、大括号、胖箭头)
1. 分号使用规则
- 变量赋值语句必须加分号:比如
duplicate和duplicate2是把匿名函数赋值给变量,属于赋值语句,结尾必须加;。 - 命名函数定义不需要分号:像
duplicate3、duplicate8这类带名字的函数,是声明而非语句,大括号后不用加分号。 - 匿名函数作为表达式时,若整体是赋值/返回语句,结尾仍需分号:比如把匿名函数赋值给变量、作为函数返回值的情况,语句整体要以分号收尾。
2. 大括号与胖箭头(=>)
- 大括号
{}用于包裹多行函数体,必须用return明确指定返回值(void函数除外)。 - 胖箭头
=>是单行函数体的简写,自动返回箭头后的表达式结果,不用写return,也不能加大括号(箭头后只能是单个表达式,不能放多行语句)。
二、逐个解析每个函数
1. duplicate
- 语法:把一个接受
int参数、返回int的匿名函数,赋值给Function类型的变量duplicate,属于赋值语句,所以结尾加;。 - 调用:直接
duplicate(5),变量本身指向函数,可直接调用。
2. duplicate2
- 语法:
duplicate的胖箭头简写版,用=> y * 2替代了大括号和return,逻辑完全一致,同样是赋值语句,结尾加;。 - 区别:仅写法更简洁,功能和
duplicate无差异。
3. duplicate3
- 语法:属于返回函数的高阶函数,本身无参数,执行后返回一个匿名函数(接受
int参数并返回其2倍)。作为命名函数声明,大括号后不用加分号。 - 调用:
duplicate3()(20),先调用duplicate3()拿到返回的匿名函数,再用这个匿名函数传入20执行。
4. duplicate4
- 语法:同样是返回函数的高阶函数,不过它的返回值是调用
duplicate3()得到的函数,相当于转发duplicate3的返回结果。 - 调用:
duplicate4()(30),先执行duplicate4()拿到duplicate3()返回的匿名函数,再执行该函数。
5. duplicate5
- 语法:返回之前定义的
duplicate变量(即那个匿名函数),属于返回已有函数引用的高阶函数。 - 调用:
duplicate5()(40),先执行duplicate5()拿到duplicate指向的函数,再执行它。
6. duplicate6(错误原因)
- 问题:
duplicate6声明返回类型是Function,但函数体里只定义了内部函数duplicate7,却没有返回任何值。Dart要求有返回类型的函数必须明确返回对应类型的值,所以这里缺少返回语句。 - 修正示例:
Function duplicate6() { Function duplicate7() { return (int a) => a * 2; } return duplicate7(); // 返回duplicate7执行后的匿名函数,也可以写return duplicate7; 返回duplicate7函数本身 }
7. duplicate8
- 语法:Dart标准的普通命名函数,明确声明了参数类型和返回值类型
int,函数体用大括号包裹,通过return返回结果。作为命名函数,结尾不用分号。 - 调用:直接
duplicate8(50),和常规函数调用逻辑一致。
三、各函数适用场景
duplicate/duplicate2:适合需要把函数作为变量传递的场景,比如作为参数传给集合的map、where等高阶函数,或者在需要动态切换函数逻辑的地方使用。duplicate3/duplicate4/duplicate5:属于高阶函数,适合动态生成函数的场景,比如根据外部条件返回不同逻辑的函数、实现函数柯里化(拆分多参数函数为多个单参数函数),或者封装函数生成逻辑。duplicate8:适合逻辑固定、需要复用的常规场景,是最常用的函数写法,可读性高,覆盖大多数普通功能实现需求。
内容的提问来源于stack exchange,提问作者Orhan Sırmalı
相关产品推荐
相关产品推荐

