学习Dart函数,我觉得应该要和Js函数类比。各种写法五花八门的!!!

在Dart中,函数也是一个对象,它的类型是Function。它可以被赋值给变量,也可以被作为参数传递

常规套路

声明

  1. bool isNoble(int atomicNumber) {
  2. return atomicNumber != null;
  3. }
  • 如果一个函数没有声明返回值,Dart会自动推导它的返回值类型
  1. void main() {
  2. bool b = isNoble(2);
  3. print(b);
  4. }
  5. isNoble(int atomicNumber) {
  6. return atomicNumber != null;
  7. }
  8. >>>
  9. true
  • 如果一个函数没有显示的return,那么它默认会返回null
  1. fun() {}
  2. assert(fun() == null)
  • 如果一个函数只有一句表达式,可以使用简写,也就是箭头函数
  1. bool isNoble(int atmicNumber) => atomicNumber != null;
  2. isNoble(int atmicNumber) => atomicNumber != null;

函数参数

可选命名参数

用大括号来定义的参数列表

  1. void func(String name, {String sex = "", int age = 0}) {
  2. //
  3. }

可选位置参数

dart中声明List格式的参数列表,使用中括号

  1. void printInfo(String name, [String? sex, int? age]) {
  2. //
  3. }
  4. printInfo("name","");
  5. printInfo("name","", 12);

匿名函数

这个简单

  1. var func = (x, y) {
  2. print("x: $x, y: $y");
  3. };
  4. main() {
  5. func(5, 6);
  6. }

立即执行函数

和JS里面的立即执行很像,后面一个括号代表直接调用了

  1. main() {
  2. () {
  3. print("test");
  4. }();
  5. }
  6. >>>
  7. test

顶层函数

不在class里面的函数,叫做顶层函数,比如main方法

  1. main() {
  2. print('Hello World');
  3. }

静态函数

在类对象方法前加上static就是静态函数

  1. class Point {
  2. static int add(int a, int b) {
  3. return a + b;
  4. }
  5. }

和java一样,静态方法可以直接使用类名+方法名完成调用

闭包

  1. Function getValue() {
  2. int num = 0;
  3. return () {
  4. return ++num;
  5. };
  6. }
  7. main() {
  8. Function f = getValue();
  9. print(f());
  10. print(f());
  11. }
  12. >>>
  13. 1
  14. 2

参考
深入理解 Dart Function & Closure
深入理解 Function & Closure

函数类型与签名

函数作为参数

  1. void func(Function f, String content) {
  2. f(content);
  3. }
  4. void main() {
  5. Function f = (String text) {
  6. print(text);
  7. }
  8. func(f, "Test Text");
  9. }

直接使用Function类型来声明函数变量做形式参数,是无法检查该函数的形式参数的

这时候,就需要使用关键字typedef来定义函数的签名

typedef

这个是新花样

  1. // 写法一
  2. typedef void F(String);
  3. // 写法二:推荐
  4. typedef F = void Function(String);

这样定义以后,它会严格检查 函数的参数类型 和 返回值类型 是否和 Compare 类型函数 完全对应,不对应的话,编译就会报错。