Dart在2.6.0之后,新增了extension function,也就是扩展函数功能。可以在不修改原代码的基础上,为类、函数添加额外函数的功能,类似于静态函数的功能。
1.为类添加函数功能
比如:
extension StringExtension on String{
hello(){
print('hello,$this');
}
}
void main(){
String dartStr = 'dart';
dartStr.hello();
}
我们为类String添加了一个extension,命名为StringExtension。如果你命名的这个extension被使用在同一个文件中,那么这个StringExtension可以被省略.
这个StringExtension为String类添加了hello函数,打印时在原本字符串前加上hello,结果是:
hello,dart
2.为函数添加函数功能
- 比如我们想得到任何一个无参函数的返回值类型,我们可以使用如下扩展函数:
extension FunctionReturnType <T> on T Function(){
Type get returnType => T;
}
同样的,如果该扩展函数只在同一个dart文件中被调用,可以省略FunctionReturnType,即:
extension <T> on T Function(){
Type get returnType => T;
}
用法如下:
int getInt() => 11;
void main(){
print(getInt.returnType);//打印结果是int
}
- 更加复杂的一种使用方式是,为函数添加扩展功能,返回另一个函数,如下所示:
void main(){
// 每个int值加2
print([0, 1, 2].map((value) => add(value, 2))); // 打印结果 [2, 3, 4]
// 使用"curry"函数实现如上一样的功能
print([0, 1, 2].map(add.curry(2))); //打印结果 [2, 3, 4]
}
int add(int increment, int value){
return value + increment;
}
// 为函数 Func1 添加扩展功能 curry :
// Func1 是参数类型分别为 First 和 Second ,返回值为 Result 的函数
// 扩展功能 curry 是参数类型为 First,返回类型为函数 FinalFunc
// FinalFunc 是 参数 Second,返回类型为 Result 的函数
extension<Result, First, Second> on Result Function(First, Second){
Result Function(Second) curry(First first){
return (second) => this(first, second);
}
}