Dart 要想飞的高基础要打牢篇一(变量与操做符)express
函数是可读,可维护和可重用代码的构建块。 函数是一组用于执行特定任务的语句。 函数将程序组织成逻辑代码块。 一旦定义,能够调用函数来访问代码。 这使得代码能够重用。 此外,函数能够轻松读取和维护程序的代码。闭包
函数这块的话没啥好讲的,我主要经过例子的方式来跟你们讲解,相信你们看了就会明白,不明白的能够直接留言,我会及时回复的ide
普通函数与 Lambda 函数的定义的方式函数
// 推荐
int add(int x, int y) {
return x + y;
}
// 函数定义可省略类型,但并不推荐
add1(x, y) {
return x + y;
}
// 当函数体内只有一个表达式的时候可使用:
//语法 [return_type]function_name(parameters)=>expression;
int add2(int x, int y) => x + y;
print(add(1, 2));
复制代码
注意:全部的函数都返回一个值。若是没有指定返回值,则 默认把语句 return null; 做为函数的最后一个语句执行post
可选命名参数:使用 {param1, param2, …}
的形式来指定命名参数ui
int add({int x, int y}) {
x ??= 1;
y ??= 2;
return x + y;
}
print(add(x:2, y:4)); // 6
print(add()); // 3;
复制代码
在这里咱们在函数体内 x ??= 1
是由于这个函数是可选参数,若是没有这个参数咱们直接 return x + y 会报错的spa
提示很明确: 没法读取null的属性,你们须要多多注意啊code
可选位置参数:把可选参数放到 []
中,必填参数要放在可选参数前面cdn
int add(int x, [int y, int z]) {
y ??= 2;
z ??= 3;
return x + y + z;
}
print(add(1)); // 6
print(add(1, 3, 4)); // 8
复制代码
可选命名参数默认值(默认值必须是编译时常量), 目前可使用等号 '='
或冒号 ':'
对象
int add(int x, {int y = 2, int z = 3}) => x + y + z;
print(add(1)); // 6
print(add(1, y: 5)); // 9
复制代码
Dart SDK 1.21 以前只能用冒号,冒号的支持之后会移除,因此建议使用等号
可选位置参数默认值(默认值必须是编译时常量),只能使用等号 '='
int add(int x, [int y = 2, int z = 3]) => x + y + z;
print(add(1)); // 6
print(add(1, 3, 5)); // 9
复制代码
匿名函数的参照以下:
([[Type] param1[, …]]) {
codeBlock;
};
复制代码
匿名函数,顾名思义就是没有名字的函数
无参匿名函数:
var info = () => print('这是无参匿名函数');
info(); // 这是无参数匿名函数
复制代码
有参匿名函数:
var info = (name) => 'I am $name';
print(info('gaozan')); // I am gaozan
复制代码
List.forEach() 就用的匿名函数
List list = [1, 2, 3];
list.forEach((item) => print('$item'));
复制代码
一般不但愿再次使用(即只使用一次的)的函数能够定义为匿名函数
扩展: 若是仍是想再次使用匿名函数的话, 也有方法, 像咱们上方的例子同样。可赋值给变量,经过变量调用
闭包是一个方法(对象)
闭包定义在其余方法内部
闭包可以访问外部方法内的局部变量,并持有其状态(这是闭包最大的做用,能够经过闭包的方式,将其暴露出去,提供给外部访问)
返回Function对象(闭包)下面有一个例子:
Function makeAddFunc(int x) {
x++;
return (int y) => x + y;
}
main() {
var addFunc1 = makeAddFunc(2);
var addFunc2 = makeAddFunc(4);
print(addFunc1(3)); // 6
print(addFunc2(3)); // 8
}
...
// 你们能够先想想结果为何是 6 和 8 ?
复制代码
画图一贯丑,不要介意。不明白直接留言,知无不言
普通的函数定义。在赋值以后,会丢失函数签名信息。
使用typedef 给函数起一个别名,使用比较方便。例如定义一个方法的回调,直接使用别名定义
void main() {
// 函数别名
MyAlias myAlias;
// 能够指向任何同签名的函数
myAlias = subtsract;
myAlias(4, 2); // subtsract: 2
myAlias = divide;
myAlias(4, 2); // divide: 2
// typedef 做为参数传递给函数
calculator(4, 2, subtsract); // subtsract: 2
}
// 函数别名
typedef MyAlias(int a, int b);
// 根据MyAlias相同的函数签名定义两个函数
subtsract(int a, int b) {
print('subtsract: ${a - b}');
}
divide(int a, int b) {
print('divide: ${a / b}');
}
// typedef 也能够做为参数传递给函数
calculator(int a, int b, MyAlias func) {
func(a, b);
}
复制代码
再来个好玩的,我就不讲了哈,Demo3 你们本身玩一玩,能够贴到留言里哈
void main() { // 主入口
Fun1 fun1;
fun1 = add;
Demo1(fun1, 1, 2); // sum1 = 3
Demo2(fun1, 1, 2); // sum2 = 3
// Demo3() ... ???
}
typedef Fun1(int a, int b);
typedef Fun2<T, K>(T a, K b);
int add(int a, int b) {
print('a + b');
return a + b;
}
Demo1(int f(int a, int b), int x, int y) {
var sum = f(x, y);
print("sum1 = $sum");
}
Demo2(Fun1 f, int x, int y) {
var sum = f(x, y);
print("sum2 = $sum");
}
Demo3(Fun2<int, int> f, int x, int y) {
var sum = f(x, y);
print("sum3 = $sum");
}
复制代码
递归这个没啥好讲的,跟其余语言都差很少,留一个例子,经过方法的递归求和
main() {
var sum = 0;
fn(int n) {
sum += n;
if (n == 0) {
return;
}
fn(n - 1);
}
fn(100);
print(sum);
}
复制代码
Dart 要想飞的高基础要打牢篇一(变量与操做符) 我的博客 能够根据博客右上角的 qq 图标直接联系我哈
在写这篇文章的时候我都不知道该怎么样去讲函数,虽然短短一篇文章但我也是绞尽脑汁,写的很差请你们见谅,你们凑合看哈