首页 > 解决方案 > 我们如何在 Dart 2 中将 int 转换为 BigInt?

问题描述

在 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' has no instance method 'pow'异常。似乎x被视为香草味int......

此外,如果我尝试x更明确地实例化:

var x = new BigInt.from(5);

我得到NoSuchMethodError:类 'int' 没有实例获取器 '_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'异常。)

正如我已经提到的,这并不能解释一切。允许这样的表达式 asBigInt x = 5以及诸如x % 3then 的表达式按预期工作的事实表明BigInts 和ints旨在无缝地协同工作,至少在某些设计师的论文中......

标签: dart

解决方案


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

您的修复,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那么当您尝试将 an 分配intBigNum变量时,您将收到类型错误。


推荐阅读