前言
前两篇文章分别讲解了Dart中的变量和内置类型,对Dart的基本语法已经有了了解,那么今天来说一下Dart中的函数,也就是方法。前两篇文章没有看的,建议先看一下前两篇文章。
那些你不知道的Dart细节之变量
那些你不知道的Dart细节之内置类型
那些你不知道的Dart细节之函数(方法)
那些你不知道的Dart细节之操作符、流程控制语句、异常
那些你不知道的Dart细节之类的点点滴滴
那些你不知道的Dart细节之泛型和库
定义
-
可在函数内定义
1
2
3
4
5
6 1void main(){
2 void test(){
3 }
4}
5
6
和Java不同,Dart中的函数可以定义在函数内部(和Java的匿名内部类别搞混了)
-
定义函数时可省略类型(不建议)
1
2
3
4
5
6
7 1main(){
2 test(){
3 // return null;
4 }
5}
6
7
上面的函数可以写成下面这样,Dart中函数是Function类型的对象。所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。
-
支持缩写语法 => (Kotlin是用=来实现)
1
2
3
4
5
6
7
8
9 1main(){
2 print(test1());
3}
4test()=> "zhujiang";
5String test1(){
6 return "zhujiang";
7}
8
9
上面代码中的test()和test1()效果是一样的,“=>”相当于大括号和return
可选参数
既然是函数,那么肯定要传参,我在经过Java构造方法的摧残之后,看这个功能的时候泪流满面?。为什么会这样呢?下面先来看一个咱们的Java类的构造函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 1public class Test {
2
3 private String name;
4 private int age;
5 private String address;
6
7 public Test(String name, int age, String address) {
8 this.name = name;
9 this.age = age;
10 this.address = address;
11 }
12
13 public Test(String name, String address) {
14 this.name = name;
15 this.address = address;
16 }
17
18 public Test(String name, int age) {
19 this.name = name;
20 this.age = age;
21 }
22
23 public Test(String name) {
24 this.name = name;
25 }
26}
27
28
一个非常简单的构造方法,只是想要传参数形式多一点,竟然需要写这么多重载方法。。。那么下面咱们来看一下拿Dart写的同样功能的代码:
1
2
3
4
5
6
7
8 1class Test{
2 String name;
3 int age;
4 String address;
5 Test(this.name, {this.age, this.address});
6}
7
8
What?竟然可以这样?是的,可以这样。下面来详细说一下函数的可选参数。
可选命名参数
其实上面构造方法我使用的就是可选命名参数,写的时候其实很简单,只需要加上大括号就行。下面是使用方法:
1
2
3
4
5
6
7
8
9 1main() {
2 print(add(a: 1, b: 3));
3}
4
5int add({int a = 1, int b}) {
6 return a + b;
7}
8
9
上面的add方法调用的时候可以不填参数,也可以填任何一个参数,也可以将参数都填上。这里要注意:
- 如果a不填的话,默认值就是1,如果b不填,默认值就是null。
- 传参数的时候一定要记得写a:,不然会报错。
可选位置参数
和上面的可选命名参数不同,上面的函数如果想调用,必须命名再加上冒号才能使用,可选位置参数就不需要了。这里和上面一样,默认值可加可不加:
1
2
3
4
5 1int add2(int a,[int b = 2,int c = 3]) {
2 return a + b;
3}
4
5
下面是上面add2()方法的几种调用方式:
1
2
3
4
5 1 print(add2(1));
2 print(add2(1,2));
3 print(add2(1,1,3));
4
5
注意
上面的可选命名参数和可选位置参数,可使用list或map作为默认值,但必须是const。
1
2
3
4
5 1int add3({List a = const [1,2,3], int b = 2}) {
2 return b;
3}
4
5
匿名函数
可赋值给变量,通过变量调用。可在其他函数中直接调用或传递给其他函数。匿名函数分为无参匿名函数和有参匿名函数:
-
无参匿名函数
1
2
3 1var printFun = () => print("**无参匿名函数**");
2
3
-
有参匿名函数
1
2
3
4 1var printFun2 = (name) => print("**有参匿名函数 $name**");
2printFun2("sss");
3
4
这里还有一个小的知识点:可以通过()调用,不推荐。
1
2
3 1(() =>print("***可以通过()调用,不推"))();
2
3
闭包
这里感觉没什么好说的,大家直接看代码应该就可以理解:
1
2
3
4
5
6
7
8 1Function makeAddFunc(int x) {
2 x++;
3 return (int y) => x + y;
4}
5var makeAddFun = makeAddFunc(11);
6print(makeAddFun(10));
7
8
就是创建一个方法,返回的也是一个方法,可以再继续调用。
函数别名
用typedef给函数起一个别名,使用比较方便。例如定义一个方法的回调,直接使用别名定义。没返回值,则只要参数匹配就行了,如果定义了返回值,则返回值不一样会报错。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 1typedef Fun1(int a, int b);
2typedef Fun2<T, K>(T a, K b);
3int add(int a, int b) {
4 print('a + b');
5 return a + b;
6}
7class Demo1 {
8 Demo1(int f(int a, int b), int x, int y) {
9 var sum = f(x, y);
10 print("sum1 = $sum");
11 }
12}
13class Demo2 {
14 Demo2(Fun1 f, int x, int y) {
15 var sum = f(x, y);
16 print("sum2 = $sum");
17 }
18}
19class Demo3 {
20 Demo3(Fun2<int, int> f, int x, int y) {
21 var sum = f(x, y);
22 print("sum3 = $sum");
23 }
24}
25
26
上面代码就是定义函数别名的方法,下面是调用方法:
1
2
3 1Fun1 fun1 = add(11, 12);
2
3
总结
到这里Dart的第三篇文章就结束了,本篇文章主要讲解了一下Dart语言的函数(方法)。下一篇文章讲解一下Dart中的操作符、流程控制语句和异常,希望大家能够喜欢,对大家如果有帮助的话,欢迎点赞关注,如果有异议,可以留言进行讨论。