BigInt在 Dart 2(Dart VM 版本:2.0.0-dev.50.0)中玩这个类,我遇到了以下问题:
BigInt x = 5;
print(x % 3); // 2
print(x ~/ 3); // 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好,但是......
当我尝试访问这些方法时,例如:
print(x.pow(2));
Run Code Online (Sandbox Code Playgroud)
我得到一个NoSuchMethodError: Class 'int' has no instance method 'pow'异常。似乎x被视为香草味int......
此外,如果我尝试x更明确地实例化:
var x = new BigInt.from(5);
Run Code Online (Sandbox Code Playgroud)
我得到NoSuchMethodError: Class 'int' has no instance getter '_used'。
我误解了文档吗?具体来说,我们如何将int, like5或['a', 'b', 'c'].length, 转换为BigInt对象?
编辑:虽然这并没有解释为什么BigInt x = 5然后这样的表达式x % 3不会产生错误并按预期工作,但这似乎只是由于BigInts 和ints 不能很好地协同工作。例如,一旦x确实确实表示 a BigInt(与使用 实例化时不同BigInt x = 5,之后x似乎表示正则int)则表达式x % 3不起作用,因为该%操作期望BigInt在右侧有 a ,而事实并非3如此。(表达式需要更改为笨拙x % new BigInt.from(3)以摆脱NoSuchMethodError: Class 'int' has no instance getter '_used'异常。)
正如我已经提到的,这并不能解释一切。BigInt x = 5允许这样的表达式以及诸如x % 3then 的表达式按预期工作的事实表明BigInts 和ints旨在无缝地协同工作,至少在某些设计师的论文中......
您正在 Dart 1 生产模式下运行 Dart,并且没有使用分析器测试您的代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。文字5不是BigInt,而是int。您将其分配给类型为 的变量BigInt,但在 Dart 1 生产模式中,变量类型被忽略,因此“成功”。
BigInt沙ints 并不意味着要无缝地协同工作,但是如果您实际上不检查类型,您就不会知道您使用的是错误的类型。
你的修正,var x = new BigInt.from(5);,是正确的。Dart 不做隐式转换,你必须显式地创建一个BigInt才能得到一个。这也意味着您必须执行以下操作:
var x = new BigInt.from(5);
print(x % new BigInt.from(3)); // 2
Run Code Online (Sandbox Code Playgroud)
该代码应该可以工作。所以如果它抛出,那就是有问题。我尝试了 Dart 2.0.0-dev.49.0 中的代码,它奏效了。您使用的是哪个版本的 Dart (dart --version ) 以及您如何运行它?
如果你运行你的程序,dart --checked program.dart那么当你尝试给int一个BigNum变量赋值时你会得到类型错误。
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |