读不在三更五鼓,功只怕一曝十寒 —— 郭沫若
Dart 函数详解
简单案例
定义一个返回值是布尔类型的函数,之后在 main 【一个程序开始运行的函数】函数中进行调用,实例中实可以不进行函数返回值明确声明调用的【但是作为一个写惯了java的代码,建议还是带上比较好,更明确一些】
// main 函数是最顶级的函数是一个程序开始运行的函数
void main() {
var res = exec(); // 函数调用
print(res);
print(exec_1());
}
// 定义一个函数叫做exec,返回类型是一个布尔类型
bool exec(){
return true;
}
// 当然了其实不写具体的返回类型也是可以的
exec_1(){
return true;
}
箭头函数
如果函数中只有一句表达式,可以使用简写语法:那么就是箭头表达式 =>
注意:在箭头 => 和分号之间只能使用一个 表达式 ,不能是语句,也就是单句表达式【JS 中随便只要是能用{}花括号括起来就行】
exec_2() => true;// 也就是上面的语法可以简洁成这个样子
可选参数
可选参数可以是命名参数或者位置参数,但一个参数只能选择其中一种方式修饰
普通参数
当我们进行函数调用的时候就是函数有几个参数就放几个参数值就可以了,比如下面的函数计算两个整形的数值
void main() {
var res = exec(1,2);
print(res);
}
int exec(int num_1,int num_2){
return num_1 + num_2;
}
命名参数
调用函数时,可以使用指定命名参数进行传值调用,但是定义函数的时候参数定义的时候必须要用花括号括起来,此时进行参数调用的时候就可以指定参数名称进行调用了,在函数定义的时候给了默认值,不然编译器会给错误提示,当然了也可以用required注解来解决
void main() {
// 命名参数方式进行函数调用
var res = exec(num_2: 1,num_1: 2);
print(res);
}
// 在进行函数定义的时候给了默认值,不然编译器会给错误提示
int exec({int num_1 = 0,int num_2 = 0}){
return num_1 + num_2;
}
// 当然了也可以用 @required 来解决
int exec_1({ int num_1, int num_2}){
return num_1 + num_2;
}
// 也可以一个是命名的一个是普通的
int exec_1(int num_1,{int num_2 = 0}){
return num_1 + num_2;
}
位置参数
将参数放到 [] 中来标记参数是可选的,定义了一个三个数字的求和函数,不过第三个参数是一个可选参数
void main() {
var res_1 = exec_2(2,2); // 只给前两个参数进行传值计算
var res_2 = exec_2(2,2,2); // 第三个可选参数也进行传值计算
print(res_1); // 4
print(res_2); // 6
}
// 定义了一个三个数字的求和函数,不过第三个参数是一个可选参数
int exec_2(int num_1,int num_2,[int num_3 = 0]){
return num_1 + num_2 + num_3;
}
匿名函数
多数函数是有名字的, 比如 main() 和 print()。 也可以创建没有名字的函数,这种函数被称为匿名函数, 有时候也被称为 lambda 或者 closure ,匿名函数可以赋值到一个变量中。
void main() {
var list = ['apples', 'bananas', 'oranges'];// 定义一个字符串数组
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});
print("---------------");
list.forEach((item)=>print('${list.indexOf(item)}: $item')); // 箭头函数的方式
}
词法闭包
闭包即一个函数对象,即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量,函数可以封闭定义到它作用域内的变量
/// 返回一个函数,返回的函数参数与 [addBy] 相加。
Function makeCalcFun(num addBy) {
return (num i) => addBy + i;
}
void main() {
// 创建一个加 2 的函数。
var add2 = makeCalcFun(2); // 返回一个能计算+2的函数给add2
// 创建一个加 4 的函数。
var add4 = makeCalcFun(4); // 返回一个能计算+4的函数给add4
print(add2(1));
print(add4(1));
}
运算符
大部分的运算符和其他的语言都是一样的唯一的有一个区别的就是条件运算符
条件运算符
expr1 ?? expr2=> 如果 expr1 不是null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值
级联运算符
..=> 级联运算符 (..) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性
querySelector('#confirm') // 获取对象。
..text = 'Confirm'; // 调用成员变量。
上面的代码等价于:
var button = querySelector('#confirm');
button.text = 'Confirm';
总结
其实Dart提供的函数主要的差别就在于命名参数和位置参数这两个特殊之处,别的其他的语言也都会有,比如JS 语言的闭包,匿名函数都会有,运算符 ?? 这种还是第一次见到,还有级联运算符这种别的语言也有提供不过语法不同罢了