Rust ops特征怎么可能不在范围内?

Rust ops特征怎么可能不在范围内?,rust,Rust,我个人不喜欢缺乏可读性运算符,因此我更喜欢使用.not() 虽然(显然)人们可以这样写: fn main() { let some_condition = false; if !some_condition { println!("condition is false"); } } 这不适用于某些条件。not(),除非我导入std::ops::not。为什么会这样?我认为可以在Rust中使用运算符,因为它们的特性在范围内是调用not方法的快捷方式,不是

我个人不喜欢
缺乏可读性
运算符,因此我更喜欢使用
.not()

虽然(显然)人们可以这样写:

fn main() {
    let some_condition = false;

    if !some_condition {
        println!("condition is false");
    }
}

这不适用于
某些条件。not()
,除非我导入
std::ops::not
。为什么会这样?我认为可以在Rust中使用运算符,因为它们的特性在范围内<代码>是调用
not
方法的快捷方式,不是吗?

您的假设是错误的。编译器将运算符转换为对trait函数的调用(除了原语,在原语中它将它们直接转换为低级操作1),但是trait不需要在该范围内

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


1。是为基本类型实现的
Add
。请注意,
add
的定义是
self+other
!显然,编译器从未实际使用过这个impl

您是否有“将它们直接转换为低级操作”的参考资料?您可以说这是显而易见的,因为基本类型的trait实现使用操作符,否则它将循环…@Stefan是基本类型实现Add的地方。请注意,
add
的定义是
self+other
!显然,编译器从未实际使用过这个
impl