代码之家  ›  专栏  ›  技术社区  ›  mochaccino

-1和pow的特殊行为

  •  1
  • mochaccino  · 技术社区  · 3 年前

    我正在调试一些代码来计算矩阵的行列式,当我发现原因时,我非常失望。简单地说,这个代码:

    -1i64.pow(i as u32)
    

    总是导致 -1 。我发现我可以 i64::pow 相反,或包装 -1i64 括号中以解决问题:

    i64::pow(-1, i as u32)
    (-1i64).pow(-1, i as u32)
    

    我很失望,也很伤心,因为rustc告诉我用第一个例子:

      |
    3 |         println!("{}", -1.pow(i as u32));
      |                              ^^^
      |
    help: you must specify a concrete type for this numeric value, like `i32`
      |
    3 |         println!("{}", -1_i32.pow(i as u32));
      |                            ~~~~~
    

    我试着加下划线和不加下划线,结果都是-1。我的问题是,为什么会出现这种情况?括号的作用是什么?什么是 -1i64.pow(i as u32) 事实上 做我在文档、Rust书或Stack Overflow中找不到任何内容。

    Here's a playground

    1 回复  |  直到 3 年前
        1
  •  7
  •   Amadan    3 年前

    您的代码解析为 -(1.pow(...)) 1.pow(...) 1 .否定 1. 生产 -1 .和往常一样,括号会更改优先级,因此 pow 发送到 -1 1.

    我很失望,也很伤心,因为rustc告诉我用第一个例子:

    Rust不知道你是否想否定 1. 1.pow(…) ,所以你的失望被取代了:P


    关于JavaScript的附录:

    我来自JavaScript,我们做不到 2.someMethod()

    当然,您可以对数字调用方法;但是如果你在JavaScript上这样做,JavaScript会抱怨 1. 因为它总是期望第一个点是小数点,所以如果直接对数字文本调用方法,则必须使它们浮动(即。 1.toString() 是坏的, 1.0.toString() 很好 (1).toString() 1..toString() )。

    现在 Number 没有方法 pow ,但我们可以制作它(仅用于演示目的,因为不建议更改内置原型):

    Number.prototype.pow = function(p) { return Math.pow(this, p) }
    

    现在您的情况与Rust中的情况相同:

    -1.0.pow(2)
    # => -1
    (-1.0).pow(2)
    # => 1
    
    推荐文章