首页 > 解决方案 > Dart中引用方法的语法?

问题描述

Dart 支持引用静态函数,但是否有语法来引用对象上的方法,类似于 Java/Kotlin?

[1, -3, 5].map((n) => n.abs()).forEach(print); // this works...
[1, -3, 5].map(int::abs).forEach(print); // ...but this won't compile

标签: dart

解决方案


我之前说过,Dart 不能做你想做的事情,因为要调用实例方法,你需要一个实例。也就是说,您正在做的事情让人想起 Javascript 编码风格,并且对于 Dart 来说不是很地道。我建议改为:

final list = [1, -3, 5];
for (var n in list) {
  print(n.abs());
}

或者

final list = [1, -3, 5].map((n) => n.abs());
for (var n in list) {
  print(n);
}

除非您有可以传入的预先存在的方法,否则不严格推荐该forEach方法。否则,它往往会使代码更密集,因此难以一目了然。(而且这不是 Javascript,在使用常规的旧 for 循环时,您无需担心范围或关闭问题。)

编辑:

有一种可能的解决方法,尽管我不确定这样做有什么意义,除非它引起了一种特殊的幻想。您可以在本地匿名方法中“包装”对实例方法的调用,然后将该方法的引用传递给(在您的情况下)该map方法:

int abs(int i) => i.abs();
[1, -3, 5].map(abs).forEach(print);

在实践中,这实际上只是将您在第一个示例中创建的 lambda 方法分解为一个独立的方法,因此有一个论点是,这种方法只会成功地使过程变得比它需要的更复杂。


推荐阅读