我们如何在Dart 2中将int转换为BigInt?

时间:2018-04-28 09:08:10

标签: dart

在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不起作用,因为%操作在右侧需要BigInt3不是。 (表达式需要更改为笨重的x % new BigInt.from(3)以摆脱 NoSuchMethodError:Class' int'没有实例getter' _used' 异常。)

正如我已经提到的,这并不能解释一切。允许使用BigInt x = 5这样的表达式,以及x % 3等表达式按预期工作的事实表明BigIntint意味着无缝地一起工作,至少在一些设计师的论文上......

1 个答案:

答案 0 :(得分:2)

您在Dart 1生产模式下运行Dart,而无需使用分析器测试代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。 文字5不是BigInt,而是int。您将其分配给键入为BigInt的变量,但在Dart 1生产模式中,忽略变量类型,以便&#34;成功&#34;。 BigIntint并不意味着无缝地协同工作,但如果您实际上没有检查类型,则您不会知道您使用的是错误的类型。< / 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变量时,您会收到类型错误。