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

时间:2018-02-15 08:43:11

标签: rust

我个人不喜欢!运营商缺乏可读性,所以我更喜欢使用.not()

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

fn main() {
    let some_condition = false;

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

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

1 个答案:

答案 0 :(得分:8)

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

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

1。 Here是为基元类型实现Add的地方。请注意,add的定义是self + other!很明显,这个impl实际上并没有被编译器实际使用过。