学习Dart函数,我觉得应该要和Js函数类比。各种写法五花八门的!!!
在Dart中,函数也是一个对象,它的类型是Function。它可以被赋值给变量,也可以被作为参数传递。
常规套路
声明
bool isNoble(int atomicNumber) {return atomicNumber != null;}
- 如果一个函数没有声明返回值,Dart会自动推导它的返回值类型
void main() {bool b = isNoble(2);print(b);}isNoble(int atomicNumber) {return atomicNumber != null;}>>>true
- 如果一个函数没有显示的return,那么它默认会返回null
fun() {}assert(fun() == null)
- 如果一个函数只有一句表达式,可以使用简写,也就是箭头函数
bool isNoble(int atmicNumber) => atomicNumber != null;isNoble(int atmicNumber) => atomicNumber != null;
函数参数
可选命名参数
用大括号来定义的参数列表
void func(String name, {String sex = "", int age = 0}) {//}
可选位置参数
dart中声明List格式的参数列表,使用中括号
void printInfo(String name, [String? sex, int? age]) {//}printInfo("name","");printInfo("name","", 12);
匿名函数
这个简单
var func = (x, y) {print("x: $x, y: $y");};main() {func(5, 6);}
立即执行函数
和JS里面的立即执行很像,后面一个括号代表直接调用了
main() {() {print("test");}();}>>>test
顶层函数
不在class里面的函数,叫做顶层函数,比如main方法
main() {print('Hello World');}
静态函数
在类对象方法前加上static就是静态函数
class Point {static int add(int a, int b) {return a + b;}}
和java一样,静态方法可以直接使用类名+方法名完成调用
闭包
Function getValue() {int num = 0;return () {return ++num;};}main() {Function f = getValue();print(f());print(f());}>>>12
参考
深入理解 Dart Function & Closure
深入理解 Function & Closure
函数类型与签名
函数作为参数
void func(Function f, String content) {f(content);}void main() {Function f = (String text) {print(text);}func(f, "Test Text");}
直接使用Function类型来声明函数变量做形式参数,是无法检查该函数的形式参数的
这时候,就需要使用关键字typedef来定义函数的签名
typedef
这个是新花样
// 写法一typedef void F(String);// 写法二:推荐typedef F = void Function(String);
这样定义以后,它会严格检查 函数的参数类型 和 返回值类型 是否和 Compare 类型函数 完全对应,不对应的话,编译就会报错。
