函数内部可以定义函数
例如:
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);
}
}
Comments NOTHING