rust - -1 和 pow 的特殊行为

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

-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/

相关文章:

haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?

c++ - 我可以继承 std::array 并重载 operator [] 吗?

go - gcloud 函数部署 go 运行时错误 "undefined: unsafe.Slice

python - 在python中打印出两个列表的组合

regex - 为什么 Perl 正则表达式不匹配 "\n"和后面的字符?

c++ - 如何在始终选择第一个元素并过滤其余元素的范围内创建 View ?

bash - 使用 sed 删除算术形式

python - 在代表 python 中大文件的大字符串上加速 re.sub()?

Python - 如何删除以数字开头并包含句点的单词

rust - Rust 中的一个可变借用或多个不可变借用……为什么?