我正在调试一些代码来计算矩阵的行列式,当我找到原因时非常失望。简单地说,这段代码:
-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.pow(...))
。 1.pow(...)
是 1
。否定 1
产生 -1
。括号会像往常一样改变优先级,所以 pow
被发送到 -1
,而不是 1
。
I'm disappointed and sad-mad because rustc told me to use the first example:
Rust 不知道您是要否定 1
还是 1.pow(...)
,所以您的失望被取代了 :P
关于 JavaScript 的附录:
I come from JavaScript and we can't do
2.someMethod()
当然你可以调用数字方法;但是如果你在 1
上这样做,JavaScript 会报错,因为它总是期望第一个点是小数点,所以如果直接在数字文字上调用方法,你必须让它们 float (即 1.toString()
不好,1.0.toString()
好,(1).toString()
和 1.. toString()
).
现在,Number
没有方法 pow
,但我们可以创建它(仅用于演示目的,因为不推荐更改内置原型(prototype)):
Number.prototype.pow = function(p) { return Math.pow(this, p) }
现在你遇到了与 Rust 相同的情况:
-1.0.pow(2)
# => -1
(-1.0).pow(2)
# => 1
https://stackoverflow.com/questions/73930915/