我正在调试一些代码来计算矩阵的行列式,当我找到原因时感到非常失望。简单来说,这段代码:
-1i64.pow(i as u32)
Run Code Online (Sandbox Code Playgroud)
总是导致-1. 我发现我可以使用i64::pow替代方法,或者用-1i64括号括起来来解决问题:
i64::pow(-1, i as u32)
(-1i64).pow(-1, i as u32)
Run Code Online (Sandbox Code Playgroud)
我感到失望和悲伤,因为 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));
| ~~~~~
Run Code Online (Sandbox Code Playgroud)
我尝试过带下划线和不带下划线,它们仍然总是导致-1。我的问题是,为什么会这样?这里括号的作用是什么?-1i64.pow(i as u32) 实际上是做什么的?我在文档、Rust 书籍或 Stack Overflow 中找不到任何内容。
您的代码解析为-(1.pow(...)). 1.pow(...)是1。取反1产生-1. 像往常一样,括号改变优先级,因此pow发送到-1,而不是1。
我感到失望和悲伤,因为 rustc 告诉我使用第一个例子:
Rust 不知道你是否想要否定1or 1.pow(...),所以你的失望被转移了:P
关于 JavaScript 的附录:
我来自 JavaScript,但我们做不到
2.someMethod()
当然你可以对数字调用方法;但是如果你这样做,JavaScript 会抱怨1,因为它总是期望第一个点是小数点,所以如果直接在数字文字上调用方法,你必须让它们浮动(即1.toString()是坏,1.0.toString()是好,就像 和(1).toString())1..toString()。
现在,Number没有方法pow,但我们可以实现它(仅用于演示目的,因为更改内置原型不是推荐的做法):
Number.prototype.pow = function(p) { return Math.pow(this, p) }
Run Code Online (Sandbox Code Playgroud)
现在你遇到了与 Rust 相同的情况:
-1.0.pow(2)
# => -1
(-1.0).pow(2)
# => 1
Run Code Online (Sandbox Code Playgroud)