Dart细节之函数

发布于 2021-07-12  3 次阅读


函数内部可以定义函数

例如:

void main() {  
   void fun(){    
  
   }
}

函数可以没有返回值

不写明返回值则默认返回null

例如:

fun(){

}

匿名函数,通过()调用,不推荐

例如:

(() => print('hello'))();

Typedef

别名 - 通常被称为typedef,因为它与关键字typedef声明 - 是指代类型的简明方法。 以下是声明和使用名为Intlist的别名的示例:

typedef IntList = List<int>;
IntList il = [1, 2, 3];

别名可以具有类型参数:

typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // Verbose.
ListMapper<String> m2 = {}; // Same thing but shorter and clearer.

我们建议在大多数情况下使用内联函数类型而不是函数的TypeDefs。 但是,功能类型仍然有用:

typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}

工厂构造函数 Factory constructors

当执行构造函数并不总是创建这个类的一个新实例时,则使用 factory 关键字
工厂构造函数不需要每次构建新的实例,且不会自动生成实例,而是通过代码来决定返回的实例对象;工厂构造函数类似于 static 静态成员,无法访问 this 指针;一般需要依赖其他类型构造函数;

在以下示例中,Logger Factory构造函数从缓存中返回对象,并且记录器.FromJson Factory构造函数从JSON对象初始化最终变量。

class Logger {
  final String name;
  bool mute = false;

  // _cache is library-private, thanks to
  // the _ in front of its name.
  static final Map<String, Logger> _cache = <String, Logger>{};

  factory Logger(String name) {
    //查找指定键值 name 不存在则调用Logger._internal()添加
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }

  factory Logger.fromJson(Map<String, Object> json) {
    //将参数Map json的键值 name 对应的值转成String并返回
    return Logger(json['name'].toString());
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}

平平无奇的在校大学生