操作特征如何不在范围内?

Fre*_*ios 3 rust

我个人不喜欢!操作员缺乏可读性,所以我更喜欢使用.not().

虽然(显然)可以写出这样的东西:

fn main() {
    let some_condition = false;

    if !some_condition {
        println!("condition is false");
    }
}
Run Code Online (Sandbox Code Playgroud)

some_condition.not()除非我导入,否则这不起作用std::ops::Not.为什么会这样?我认为可以在Rust中使用运算符,因为它们的特性在范围内.!是调用not方法的快捷方式,不是吗?

Seb*_*edl 8

你的假设是错误的.编译器将运算符转换为对特征函数的调用(原语除外,它将它们直接转换为低级操作1),但特征不一定在范围内.

或者,如果愿意,您可以认为编译器将运算符转换为完全限定的调用,即!some_condition变为::std::ops::Not::not(some_condition),这显然不关心任何使用指令是否在范围内.


1. Add为原始类型实现的地方.注意那些的定义addself + other!很明显,这个impl实际上并没有被编译器实际使用.

  • @Stefan [Here](https://doc.rust-lang.org/src/core/ops/arith.rs.html#92-98)是为原始类型实现Add的地方.注意那些`add`的*definition*是'self + other`!很明显,这个`impl`实际上并没有被编译器实际使用. (2认同)