Skip to content

可调用对象(Callable objects)

在 Dart 中,如果你希望某个类的实例能够像函数一样被调用,可以通过实现 call() 方法来实现。

call() 方法允许定义了该方法的任何类的实例模拟函数的行为。该方法支持与普通函数相同的功能,例如参数和返回类型。


示例:实现 call() 方法

在以下示例中,WannabeFunction 类定义了一个 call() 方法,该方法接收三个字符串参数,将它们拼接在一起,每个字符串之间用空格分隔,并在末尾添加一个感叹号。点击“运行”按钮可以执行代码。

dart
class WannabeFunction {
  // 定义 call() 方法,接收三个字符串参数
  String call(String a, String b, String c) {
    return '$a $b $c!';
  }
}

void main() {
  // 创建 WannabeFunction 的实例
  var wf = WannabeFunction();

  // 像调用函数一样调用实例
  print(wf('Hello', 'Dart', 'World')); // 输出:Hello Dart World!
}

content_copy

说明
在这个例子中,wfWannabeFunction 类的一个实例。由于 WannabeFunction 实现了 call() 方法,因此可以直接像调用函数一样调用 wf,传递参数并获取返回值。


call() 方法的特点

  • 灵活性call() 方法可以定义任意数量和类型的参数,并返回任意类型的值,与普通函数完全一致。
  • 模拟函数行为:通过实现 call() 方法,类的实例可以像函数一样被调用,从而提供更灵活的编程方式。
  • 适用场景:当你希望某个对象既能保存状态(作为类的实例),又能像函数一样被调用时,call() 方法非常有用。

更多示例

以下是一个更复杂的示例,展示如何通过 call() 方法实现一个带有状态的“函数”:

dart
class Counter {
  int count = 0;

  // 定义 call() 方法,每次调用时增加计数并返回当前值
  int call() {
    count++;
    return count;
  }
}

void main() {
  var counter = Counter();

  print(counter()); // 输出:1
  print(counter()); // 输出:2
  print(counter()); // 输出:3
}

content_copy

说明
在这个例子中,Counter 类的实例 counter 不仅保存了一个状态(count 变量),还可以像函数一样被调用。每次调用 counter() 时,计数器会增加并返回当前值。


总结

  • call() 方法的作用:允许类的实例像函数一样被调用。
  • 实现方式:在类中定义一个名为 call() 的方法,支持参数和返回值。
  • 优势:结合了对象的状态管理和函数的行为,提供了更灵活的编程模型。
  • 适用场景:需要对象既能保存状态又能像函数一样被调用的场景,例如计数器、闭包模拟、函数工厂等。