/** * 使用匿名函数实现操作封装 * 将匿名函数作为 map 的键值,通过命令行参数动态调用匿名函数 * 运行命令 go run src/hh/main.go --skill=fly */
顺晟科技
2021-06-16 10:32:48
314
流程控制语句定义了Dart中的主要语法,语句通常使用一个或多个关键字来完成给定的任务。语句可以像告诉函数退出一样简单,也可以像指定重复命令一样复杂。
本文将详细解释流量控制语句和功能。
流量控制语句
如果语句
所有编程语言中最常用的语句是if语句。以下是if语句的语法:
if (condition)语句1 else语句2
条件可以是任意表达式,这个表达式的求值结果必须是布尔值,这和JavaScript、PHP的要求不同。在JavaScript和PHP中,即使表达式的求值结果不是布尔值,脚本引擎在执行代码时也会在底部隐式转换为布尔值。
Statement1和statement2可以是一行代码,也可以是一个代码块(用一对大括号括起来的多行代码):
void main() {
if (2 1)
Print('2大于1 ');//output: 2大于1
else {
Print('2小于1 ');
}
}
业界广为推崇的更佳做法是始终使用代码块,即使只有一行代码要执行,因为这样可以消除人们的误解,否则人们可能会对在不同条件下执行哪些语句感到困惑。
void main() {
if (2 1) {
Print('2大于1 ');//output: 2大于1
} else {
Print('2小于1 ');
}
}
Do-while语句
Do-while语句是一个测试后循环语句,也就是说,只有在循环体中的代码被执行后,才会测试退出条件。换句话说,在计算条件表达式之前,循环体中的代码至少执行一次。需要注意的是,条件表达式的语法和if语句一样,只能是布尔值。以下是do-while语句的语法:
do {
声明
} while(表达式);
以下是一个例子:
void main() {
int I=0;
do {
I=2;
印刷品(I);
} while(I 10);
}
//output: 2 4 6 8 10
while语句
While属于预测试循环语句,即在执行循环体中的代码之前,将评估退出条件。
void main() {
int i=10
while(i 0) {
print(-I);
}
}
//output: 9 8 7 6 5 4 3 2 1 0
For语句
for语句也是一个预测试循环语句,但是它必须在执行循环之前初始化变量,并定义循环之后要执行的代码。
void main() {
for(int I=0;i 10i ) {
印刷品(I);
}
}
//output: 0 1 2 3 4 5 6 7 8 9
中断和继续语句
Break和continue语句用于控制循环中代码的执行。其中break语句会立即退出循环,强制循环外的语句继续执行,而continue语句会立即退出循环,但退出循环后会继续从循环顶部执行。以下是中断的示例:
void main() {
int i=10
while (i 0) {
-I;
if(I 1==0)break;
印刷品(I);
}
print('结束');
}
//output: 9结束
如果上面的代码可以被2整除,那么循环会立即停止。这里有一个继续的例子。以下代码将只打印奇数:
void main() {
int i=10
while (i 0) {
-I;
if (i 1==0)继续;
印刷品(I);
}
print('结束');
}
//output: 9 7 5 3 1结束
交换语句
switch语句与if语句关系最为密切,也是其他语言中常用的一种流量控制语句。以下是一个使用示例:
void main() {
字符串i=' A
字符串状态;
开关(i) {
案件编号:
状态='师从上帝';
打破;
案例' A':
状态='师从暴君';
打破;
案例' B':
状态='学会混';
打破;
默认值:
状态='人渣';
}
print(state);//output:学霸
}
断言语句
Assert,顾名思义,就是一个断言,使用assert(条件)的格式。当条件评估为假时,程序将终止其执行。例如:
void main() {
print(' start ');
assert(1 0);
打印(' over ');
}
//output:开始
//未处理的异常:
//失败的断言:第23行位置10: '1 0':不是真的。
上面的代码只会输出start,在调试环境中会报错。
功能
函数是任何语言的核心概念。任何数量的语句都可以被函数封装,并且可以随时随地被调用和执行。该函数的基本语法如下:
sum(num1,num2) {
返回num1 num2
}
上面的代码中定义了一个sum函数,需要传入两个参数:num1和num2,参数的类型是int。
Dart更佳实践建议为函数体指定类型,因此在下面的代码中,我们可以指定int:
int sum(int num1,int num2) {
返回num1 num2
}
对于一个只有一个表达式的函数,我们可以用胖箭头语法来缩写,和ECMAScript 6中的箭头函数语法很像,Dart更佳实践推荐箭头函数省略类型,所以最后写成如下:
sum(num1,num 2)=num 1 num 2;
参数
函数可以有两种类型的参数:必需参数和可选参数,必需参数在参数列表之前,可选参数在必需参数之后。
可选参数也可以通过两种方式定义:可选命名和可选位置。
可选命名参数使用{param1,param2,…}形式指定命名参数:
sum({num1,num 2 })=num 1 num 2;
可选位置参数:将参数放入[]:
sum(num1,num2,[num 3])=num 1 num 2;
参数默认值
定义函数时,可以使用=来定义参数的默认值。如果没有定义默认值,默认值为空。
为可选命名参数设置默认值:
sum({num1=1,num 2=2 })=num 1 num 2;
设置可选位置参数的默认值:
sum(num1,num2,[num3=3,num 4])=num 1 num 2;
main()函数(入口函数)
每个应用程序都需要一个main()入口函数来执行。main()函数的返回值是void,并且有一个可选的ListString参数。
因此,如果需要调用sum函数,可以在main中调用:
sum({num1=1,num 2=2 })=num 1 num 2;
main() {
final foo=sum();
最终bar=sum(num1: 123,num 2: 456);
print(foo);//output: 3
print(bar);//output: 579
}
在以下示例中,主函数使用方法参数作为输入参数:
main(ListString参数)=print(参数);
//output: []
一阶函数对象
函数本身是一个对象,因此可以将另一个方法作为参数传入:
int batchIncrement(int num)=num;
void main() {
var numberList=[1,2,3];
final NumberListBig=NumberList . map(batchIncrement);
打印(NumberListBig);//output: (2,3,4)
}
匿名函数(匿名函数)
创建一个没有名称的函数,并将其分配给一个变量。在这种情况下,创建的函数称为匿名函数(也称为lambda函数)。用法示例:
函数canonical=(String str)=print(str . touppercase());
main()=canonical(' PHP ');//output: PHP
下面的代码将参数为1的匿名函数传递给映射方法:
void main() {
var水果=['香蕉','黄瓜','茄子'];
final水果索引=水果.地图((I)=' $ {水果.索引of(I)} : $ I ');
打印(水果索引);//output: (0 :香蕉,1 :黄瓜,2 :茄子)
}
静态范围
Dart是静态范围语言,也就是说大括号中的变量只能在大括号中访问,和PHP、JAVA一样。ECMAScript 6还使用了let和const这两个关键字来实现这个功能。
在下面的例子中,外层的所有变量都可以在嵌套函数中访问:
const topLevel=true
void main() {
const insideMain=true
void myFunction() {
const insideFunction=true
void nestedFunction() {
const InSidenestedFunction=true;
打印(InSidenestedFunction);//output: true
打印(InSide Function);//output: true
打印(InSidemain);//output: true
打印(TopLevel);//output: true
}
nested FuncTion();
}
my FuncTion();
}
返回值
所有函数都有返回值。如果没有指定返回值,默认情况下,return null语句将作为函数的最后一条语句执行。
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06