那些你不知道的Dart细节之函数(方法)(三)

释放双眼,带上耳机,听听看~!

前言

前两篇文章分别讲解了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中的操作符、流程控制语句和异常,希望大家能够喜欢,对大家如果有帮助的话,欢迎点赞关注,如果有异议,可以留言进行讨论。

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C/C++内存泄漏及检测

2022-1-11 12:36:11

安全技术

free命令

2021-8-18 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索