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