dart - 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 不能做你想做的事情,因为要调用实例方法,你需要一个实例。也就是说,您正在做的事情让人想起 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 方法分解为一个独立的方法,因此有一个论点是,这种方法只会成功地使过程变得比它需要的更复杂。
推荐阅读
- realm-list - 删除列表中的类
在领域迁移期间 - palantir-foundry - 如何在不使用 tranform 或 tranform_df 的情况下在 palantir Foundry 中导入单个数据集
- reactjs - react-firebaseui StyledFirebaseAuth 没有被编译
- visual-studio-code - 在vscode中如何向状态栏添加多个选项
- php - 如何在laravel中获取总和并分离每个ID的总数
- json - 谷歌识别的 JSON LD 格式的 Schema.org,但在网站控制台中显示错误
- compiler-errors - 为什么我的代码在混音时显示编译错误?
- sequelize.js - 为什么 Sequelize 为每个查询创建新连接?
- python - 将xml写入其中时如何删除数据框中的新行?
- websocket - WebSocket 连接到“wss://url”失败:未知原因