gpt4 book ai didi

Dart:使用泛型扩展方法,得到 NoSuchMethodError: Class 'xxx' has no instance method 'yyy'

转载 作者:行者123 更新时间:2023-12-03 02:41:23 25 4
gpt4 key购买 nike

实现 Kotlin 标准库扩展函数 let :

extension KtStd<T, R> on T {
R let(R f(T it)) => f(this);
}

并编写一个 CLI 和计算器(问题无法简化),期望:

input: 1 2 3 4 5 6 7 8 9
output: 45

input: apple 1.2 banana 3.4
output: 4.6

然后代码:

main() {
stdin.readLineSync(encoding: Encoding.getByName('utf-8')).split(" ")
.map((s) => double.tryParse(s)).where((e) => e != null).fold(0, (acc, i) => acc + i)
.let((d) => d % 1 == 0 ? d.toInt() : d)
.let((it) => print(it));
}

当输入 1 2 3 ,收到错误消息:

Unhandled exception:
NoSuchMethodError: Class 'double' has no instance method 'let'.
Receiver: 6.0
Tried calling: let(Closure: (dynamic) => dynamic)
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1 main (file:xxx.dart:xx:xx)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

另外,如果我更改 fold函数到 reduce ,给出相同的输入,得到错误信息:

Unhandled exception:
NoSuchMethodError: Class 'int' has no instance method 'let'.
Receiver: 6
Tried calling: let(Closure: (dynamic) => void)
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1 main (file:xxx.dart:xx:xx)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

Dart 版本是:

Dart VM version: 2.8.2 (stable) (Mon May 11 15:06:42 2020 +0200) on "windows_x64"

为什么我收到这些错误消息?我该如何解决?

最佳答案

Dart 扩展是静态的。它们是语法糖,应用于编译时已知的类型。这意味着扩展在 dynamic 上不起作用在运行时确定类型的值。

您的长链式表达式最终使用 dynamic类型可能是你没想到的。一个问题是当你做 .fold(0, (acc, i) => acc + i) ,回调的参数和返回类型不推导。 (见 https://github.com/dart-lang/language/issues/731。)acc因此,返回类型被假定为 dynamic 类型.

您可以通过显式指定 fold 的类型来解决此问题。 : .fold<double>(...) .

在您编辑的代码版本中,您引入了第二个问题:

extension KtStd<T, R> on T {
R let(R f(T it)) => f(this);
}

您打算 KtStd<T, R>依赖 let约束 R ,但这是倒退的。 let不先打 KtStd<T, R> 是不合法的电话 T 的扩展名. R因此不受约束并假定为 dynamic .然后强制 let返回 dynamic也。

如果可能,我建议恢复到您的早期版本,其中 letR 上是单独通用的:

extension KtStd<T> on T {
R let<R>(R f(T it)) => f(this);
}

您可以通过修改 analysis_options.yaml 在分析过程中更轻松地识别此类错误。文件和设置:

analyzer:
strong-mode:
implicit-casts: false
implicit-dynamic: false
language:
strict-raw-types: true

关于Dart:使用泛型扩展方法,得到 NoSuchMethodError: Class 'xxx' has no instance method 'yyy',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61921608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com