【问题标题】:How do we cast an int as a BigInt in Dart 2?我们如何在 Dart 2 中将 int 转换为 BigInt?
【发布时间】:2018-10-09 00:45:54
【问题描述】:

在 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: Class 'int' has no instance getter '_used'。

我误会the documentation了吗?具体来说,我们如何将int(如5['a', 'b', 'c'].length)转换为BigInt 对象?

编辑:虽然这并不能解释为什么 BigInt x = 5x % 3 这样的表达式不会产生错误并按预期工作,但这似乎只是由于 BigInts 和 ints 没有播放好好在一起。例如,一旦x 确实代表BigInt(与使用BigInt x = 5 实例化的情况不同,之后x 似乎代表常规int)然后表达式x % 3 不起作用,因为% 操作期望右侧有一个 BigInt,而 3 不是。 (表达式需要更改为笨拙的 x % new BigInt.from(3) 以摆脱 NoSuchMethodError: Class 'int' has no instance getter '_used' 异常。)

正如我已经提到的,这并不能解释一切。事实上,BigInt x = 5 之类的表达式是允许的,而x % 3 之类的表达式则可以按预期工作,这表明BigInts 和ints 意味着可以无缝地一起工作,在至少在一些设计师的论文中......

【问题讨论】:

    标签: dart


    【解决方案1】:

    您正在 Dart 1 生产模式下运行 Dart,并且没有使用分析器测试您的代码。这意味着您没有进行类型检查,并且您的程序确实不是类型正确的。 文字5 不是BigInt,而是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 运行程序,那么当您尝试将int 分配给BigNum 变量时,您将收到类型错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2012-07-20
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多