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
答案 0 :(得分:1)
我之前说过,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方法本身分解为一种方法,因此有一种观点认为,这种方法仅能使过程变得比其所需的复杂而成功。是。
答案 1 :(得分:0)
就像前面提到的,您仍然需要一个实例来引用。如果您正在寻找缩短代码的方法,则可能需要使用
[1, -3, 5].forEach((f) => print(f.abs()));