dart - 我们如何在 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
不会产生错误并按预期工作,但这似乎只是由于BigInt
s 和int
s 不能很好地配合使用。例如,一旦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 % 3
then 的表达式按预期工作的事实表明BigInt
s 和int
s旨在无缝地协同工作,至少在某些设计师的论文中......
解决方案
您正在 Dart 1 生产模式下运行 Dart,并且没有使用分析器测试您的代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。文字5
不是 a BigInt
,而是 a int
。您将其分配给类型为 的变量BigInt
,但在 Dart 1 生产模式中,变量类型被忽略,因此“成功”。
BigInt
s 和int
s 并不意味着可以无缝地协同工作,但是如果您不实际检查类型,您将不会知道您使用了错误的类型。
您的修复,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 分配int
给BigNum
变量时,您将收到类型错误。
推荐阅读
- r - 使用 padr 加厚日期范围,其中起始值与数据框中的日期之一相同
- java - Jar 文件不会与 SWT Mac 一起运行
- kubernetes - 在不分叉的情况下修改 Helm Chart 依赖项的环境变量
- android - 如何在具有平滑滚动的同一布局中拥有两个 recyclerview(先水平然后垂直)
- r - 是否有允许将数值分配给字符的功能?
- wordpress - 在 wordpress 帖子中仅显示指定的自定义分类法
- python - ValueError:时间数据'00.00.00'pyspark
- oracle - 仅仅因为另一个进程失败,Oracle APEX ARP 进程没有执行?
- azure - 如何在 Azure 策略定义中组合多个语句?
- facebook - Facebook令牌通过公共页面刮