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

Ric*_*ler 3 dart

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旨在无缝地协同工作,至少在某些设计师的论文中......

lrn*_*lrn 6

您正在 Dart 1 生产模式下运行 Dart,并且没有使用分析器测试您的代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。文字5不是BigInt,而是int。您将其分配给类型为 的变量BigInt,但在 Dart 1 生产模式中,变量类型被忽略,因此“成功”。 BigIntints 并不意味着要无缝地协同工作,但是如果您实际上不检查类型,您就不会知道您使用的是错误的类型。

你的修正,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变量赋值时你会得到类型错误。