Dart 扩展函数

5,305 阅读1分钟

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);
    }
}