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

-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)-actually能做什么?我在文档、铁 rust 书或Stack Overflow中找不到任何东西.

Here's a playground

推荐答案

您的代码解析为-(1.pow(...)).1.pow(...)等于1.把1取反等于-1.和往常一样,圆括号改变了优先顺序,因此pow被发送到-1,而不是1.

我很失望,也很伤心--因为Rustc让我用第一个例子:

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


关于JavaScript的附录:

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

当然,您可以对Numbers调用方法;但如果您在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

Rust相关问答推荐

访问Rust中的隐藏变量

将PathBuf转换为字符串

为什么 `Deref` 没有在 `Cell` 上实现?

在为第三方 struct 实现第三方特征时避免包装器的任何方法

要求类型参数有特定的大小?

Rust 重写函数参数

为什么 js_sys Promise::new 需要 FnMut?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Rust 中的内存管理

实现AsyncWrite到hyper Sender时发生生命周期错误

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

Rust 生命周期:这两种类型声明为不同的生命周期

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

如何展平以下嵌套的 if let 和 if 语句?

相交着色器从 SSBO 中读取零

有没有办法隐藏类型定义?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?

在多箱项目上仅发布一个父箱