Reference 为什么不是';不可能将借用的整数与文字整数进行比较吗?

Reference 为什么不是';不可能将借用的整数与文字整数进行比较吗?,reference,rust,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)

我想得到数组中条件为真的元素。例如我想要数组元素为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>>()
    );
}
fn main(){
设lim=10;
设mut-sieve=vec![0;lim+1];
筛[1]=1;
普林顿(
"{:?}",
筛
.国际热核实验堆(iter)
.enumerate()
.filter(|&(|,c)| c!=0)
.map(|(i,|)i)
收集::()
);
}
但这是一个编译错误:

error[E0277]:无法将`&{integer}`与`{integer}进行比较`
-->src/main.rs:10:33
|
10.过滤器(|和(|,c)| c!=0)
|^^没有`&{integer}=={integer}的实现`
|
=help:trait`std::cmp::PartialEq`未为`&{integer}实现`
当我使用
c.clone()!=0
它可以工作


如果我正确理解了错误消息,Rust会抱怨无法将借用与整数与整数进行比较。我不明白为什么它不可能实现。

您正确地解释了错误,原因是它根本没有实现。如果标准库编写者想要实现这一点,他们必须为
&i32==i32
i32==&i32
&muti32==i32
&muti32==i32
i32=&muti32
&i32=&muti32
。然后,他们必须对所有其他基本类型(
i8
i16
u8
u16
u32
i64
u64
f32
f64
,以及
char
)执行这些操作

这是大量的
PartialEq
实现

或者,他们可以要求该语言的用户编写
*c!=0


(如果你来自C++,关键的是语法上的,借用比指针更像指针。只有方法调用语法有自动的DeEF特性)。但是为什么我必须撤销它呢?每种类型只需要两个额外的实现–

&i32==i32
i32==i32
。比较
&i32==&32
已经通过deref强制工作,可变引用强制为不可变引用,因此不需要单独的实现。这对你的观点没有什么影响,但我认为这仍然值得评论。但是有自动取消引用规则。如我所见,
b==32