在Dart 2(Dart VM版本:2.0.0-dev.50.0)中使用BigInt
类,我遇到了以下问题:
BigInt x = 5;
print(x % 3); // 2
print(x ~/ 3); // 1
到目前为止,这么好,但是......
当我尝试访问这些方法时,例如:
print(x.pow(2));
我得到了一个 NoSuchMethodError:Class' int'没有实例方法' pow' 例外。似乎x
被视为香草味int
......
此外,如果我尝试更明确地实例化x
:
var x = new BigInt.from(5);
我得到 NoSuchMethodError:Class' int'没有实例getter' _used'。
我误解了the documentation吗?具体来说,我们如何将int
(例如5
或['a', 'b', 'c'].length
)转换为BigInt
个对象?
修改:虽然这并不能解释为什么BigInt x = 5
然后x % 3
这样的表达式不会产生错误并且按预期工作,但这似乎仅仅归因于BigInt
s和int
不能很好地融合在一起。例如,一旦x
确实代表BigInt
(与使用BigInt x = 5
实例化的情况不同,之后x
似乎代表常规int
})然后表达式x % 3
不起作用,因为%
操作在右侧需要BigInt
,3
不是。 (表达式需要更改为笨重的x % new BigInt.from(3)
以摆脱 NoSuchMethodError:Class' int'没有实例getter' _used' 异常。)
正如我已经提到的,这并不能解释一切。允许使用BigInt x = 5
这样的表达式,以及x % 3
等表达式按预期工作的事实表明BigInt
和int
是意味着无缝地一起工作,至少在一些设计师的论文上......
答案 0 :(得分:2)
您在Dart 1生产模式下运行Dart,而无需使用分析器测试代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。
文字5
不是BigInt
,而是int
。您将其分配给键入为BigInt
的变量,但在Dart 1生产模式中,忽略变量类型,以便"成功"。
BigInt
和int
并不意味着无缝地协同工作,但如果您实际上没有检查类型,则您不会知道您使用的是错误的类型。< / p>
您的修正var x = new BigInt.from(5);
是正确的。 Dart不进行隐式转换,您必须明确创建BigInt
才能获得一个。
这也意味着你必须这样做:
var x = new BigInt.from(5);
print(x % new BigInt.from(3)); // 2
代码应工作。所以如果它抛出,那就错了。我尝试了Dart 2.0.0-dev.49.0中的代码,它运行良好。您使用的是哪个版本的Dart(dart --version
)以及如何运行它?
如果您将程序作为dart --checked program.dart
运行,那么当您尝试将int
分配给BigNum
变量时,您会收到类型错误。