0 说明
该系列教程主要是为有一定语言基础 C/C++的程序员,快速学习一门新语言所采用的方法,属于在C/C++基础上扩展新语言的模式。
1 运算符(??= 运算符 和 ??运算符支持)
运算符部分基本和C/C++一致,包括关系运算符、逻辑运算符号、条件表达式等。因此这里主要关注不一样的地方即??= 运算符 和 ??运算符。它们表示 如果变量之前初始化过则使用原来的值,如果未初始化过则使用该值,测试代码如下:
void main() {
//--------??=--------------
//初始化过
var a = 198;
a ??= 201;
print(a);
//未初始化过
var b;
b ??= 202;
print(b);
//--------??--------------
//未初始化过
var c;
var d = c ?? 10;
print(d); // 输出10
//初始化过
var e = 20;
var f = e ?? 10;
print(f); // 输出20
}
运行结果如下所示:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
hello.dart:5:3: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
a ??= 201;
^
hello.dart:21:11: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
var f = e ?? 10;
^
198
202
10
20
[Done] exited with code=0 in 0.284 seconds
2 函数
函数实现方面在C语言基础上扩充了不少东西,宗旨就是为了方便好用。函数中定义函数、箭头函数、匿名函数、自执行方法、闭包等,这里逐一说明。
2.1 函数中的函数
在Dart语言中,可以将函数定义在函数中,不再像C/C++那样,只能在函数外定义函数,这一点更加灵活一些,代码如下所示:
void main() {
//主函数中定义函数f1
String f1(int i) {
print("f1:$i");
//函数f1中定义函数f2
String f2(String str) {
return "f2:$str";
}
return "f1" + f2("test");
}
//输出结果
print(f1(6));
}
运行效果如下:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
f1:6
f1f2:test
[Done] exited with code=0 in 0.269 seconds
2.2 箭头函数
箭头函数中,=>用于分离函数声明和函数体。相关代码如下所示:
void main() {
// 普通函数写法
void printInt1(int i) {
print(i);
}
// 箭头函数写法
void printInt2(int i) => print(i);
printInt1(1);
printInt2(2);
print("--------------------------");
List list = [2, 4, 6, 8, 10];
//普通写法
var newList = list.map((e) {
return e > 5 ? 5 : e;
});
print(newList.toList());
//箭头函数写法
var newList1 = list.map((e) => e > 5 ? 5 : e);
print(newList1.toList());
}
运行效果如下:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
2
--------------------------
[2, 4, 5, 5, 5]
[2, 4, 5, 5, 5]
[Done] exited with code=0 in 0.273 seconds
2.3 匿名函数
匿名方法一般用于变量赋值和参数传递,代码如下所示:
void main() {
//匿名方法 变量声明
var f = (int i) {
//定义了一个变量f(),后面是匿名方法,可以传递参数,也可以没有参数
print("匿名方法$i");
};
f(5);
String getInfo(f2(int i)) {
return f2(6);
}
//打印:匿名函数传递参数
print(getInfo((int i) {
return "f3=$i";
}));
}
运行效果如下:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
匿名方法5
f3=6
[Done] exited with code=0 in 0.282 seconds
2.4 自执行方法
即指不需主动调用,程序启动时会自动执行该段代码,代码如下所示:
void main() {
print("1");
//自执行代码 开始
(() {
print("自执行代码");
})();
//自执行代码 结束
print("2");
}
运行效果如下:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
自执行代码
2
[Done] exited with code=0 in 0.952 seconds
注意:自执行代码只是 执行到对应位置会自动执行,并不是程序最开始时立刻执行。
2.5 函数传参
Dart语言中函数参数这里用[ ]包含的参数为可选参数,可以传递,也可以不传递,可以赋值默认值,也可以不赋值,同时还可以将函数本身作为参数传递,相关代码如下所示:
void main() {
//参数可选
String getInfo(String name, [int? age, String? sex]) {
return "name:$name;age:$age;sex:$sex";
}
//参数可选,且有默认值
String getInfo2(String name, [int? age = 10, String? sex = "female"]) {
return "name:$name;age:$age;sex:$sex";
}
String getInfo3() {
return "name:zhangsan;age:18";
}
//函数方法可以作为参数被传递
String method1(f()) {
return f();
}
print(getInfo("name")); // 输出name:name;age:null;sex:null
print(getInfo("name", 8)); //输出name:name;age:8;sex:null
print("------------------------------------------");
print(getInfo2("name")); // 输出name:name;age:null;sex:null
print(getInfo2("name", 8)); //输出name:name;age:8;sex:null
print("------------------------------------------");
print(method1(getInfo3));
}
运行效果如下:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
name:name;age:null;sex:null
name:name;age:8;sex:null
------------------------------------------
name:name;age:10;sex:female
name:name;age:8;sex:female
------------------------------------------
name:zhangsan;age:18
[Done] exited with code=0 in 0.297 seconds
2.6 闭包
闭包概念:对于全局变量常驻内存且全局均受影响,对于局部变量又无法做到常驻内存,我们需要一种常驻内存又不影响全局的模式,因此就有了闭包,代码实现如下:
void main() {
//闭包
f() {
int count = 0;
void printf() {
count++;
print(count);
}
//特别注意 这里的写法:直接返回函数,不带括号
return printf;
}
var a = f();
a();
a();
a();
}
运行结果如下所示:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
1
2
3
[Done] exited with code=0 in 0.278 seconds
2.7 typedef关键字
typedef 在C/C++中主要为现有类型创建别名,定义易于记忆的类型名typedef 还可以掩饰复合类型,如指针和数组,比如:
typedef int size;
size array[4];//此时size相当于int
typedef int *(*pFun)(int, char*); //此时定义了一个函数指针,类型就是包含参数为(int, char*),返回值为int *的函数。
在Dart语言中 typedef的用法是类似的,相关代码实现如下:
typedef void Operate(int num1, int num2);
void main() {
Addition(int num1, int num2) {
print("Addition: ${(num1)} + ${(num2)} = ${(num1 + num2)}");
}
Subtraction(int num1, int num2) {
print("Subtraction: ${(num1)} - ${(num2)} = ${(num1 - num2)}");
}
Operate op;
op = Addition;
op(3, 5); //8
op = Subtraction;
op(5, 3); //2
}
运行结果如下所示:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
Addition: 3 + 5 = 8
Subtraction: 5 - 3 = 2
[Done] exited with code=0 in 0.278 seconds
3 顺序、选择、循环基本语句(switch case字符串支持)
关于顺序、选择循环语句这些与C/C++基本一致。这里主要看不一样地方。条件表达式中switch case支持字符串选项。使用代码描述,如下所示:
void main() {
var sex = "male";
switch(sex){
case "male" :
print("male");
break;
case "female":
print("female");
break;
default:
print("param error");
break;
}
}
运行结果如下所示:
[Running] dart "/data/AGS/Dart/Project/hello.dart"
male
[Done] exited with code=0 in 0.301 seconds