为什么不能将借用的整数与文字整数进行比较?

Max*_*nke 9 reference rust

我想在条件为真的数组中获取元素.例如.我想数组元素为0的所有索引:

fn main() {
    let lim = 10;
    let mut sieve = vec![0; lim + 1];
    sieve[1] = 1;
    println!(
        "{:?}",
        sieve
            .iter()
            .enumerate()
            .filter(|&(_, c)| c != 0)
            .map(|(i, _)| i)
            .collect::<Vec<usize>>()
    );
}
Run Code Online (Sandbox Code Playgroud)

但这是一个编译错误:

error[E0277]: can't compare `&{integer}` with `{integer}`
  --> src/main.rs:10:33
   |
10 |             .filter(|&(_, c)| c != 0)
   |                                 ^^ no implementation for `&{integer} == {integer}`
   |
   = help: the trait `std::cmp::PartialEq<{integer}>` is not implemented for `&{integer}`
Run Code Online (Sandbox Code Playgroud)

当我使用c.clone() != 0它工作.

如果我正确理解错误消息,Rust会抱怨它无法将借位与带整数的整数进行比较.我不明白为什么不应该这样.

Seb*_*edl 12

您正确解释错误,原因是它没有实现.如果标准库作家要完成这项工作,他们不得不执行PartialEq&i32 == i32,i32 == &i32,&mut i32 == i32,i32 == &mut i32,&i32 == &mut i32&mut i32 == &i32.然后,他们不得不这样做的所有其他基本类型(i8,i16,u8,u16,u32,i64,u64,f32,f64,和char).

这是一个很大PartialEq实现.

或者他们可以只是要求语言的用户写*c != 0.

(如果你来自C++,要理解的关键是在语法上,借用更像是指针而不是引用.只有方法调用语法才具有自动deref功能.)

  • 每种类型仅需要两个附加实现–`&i32 == i32`和`i32 ==&i32`。比较`&i32 ==&32`已经凭借deref强制起作用,并且可变引用强制转换为不可变引用,因此不需要单独的实现。这对您的观点并没有真正的改变,但我认为仍然值得一提。 (2认同)
  • 如果实现这些“PartialEq”,是否存在实际未定义行为的风险?对于我最初感到恼火的每一个其他 Rust 设计决策,我很快就发现它实际上阻止了我搬起石头砸自己的脚(例如[比较不同类型的整数](https://stackoverflow. com/questions/48225587/why-cant-i-compare-two-integers-of- different-types)_可能_是错误的迹象)-但我在这里看不到实际的危险情况。有吗? (2认同)