【问题标题】:Why isn't it possible to compare a borrowed integer to a literal integer?为什么不能将借来的整数与文字整数进行比较?
【发布时间】:2016-11-18 12:24:41
【问题描述】:

我想获取条件为真的数组中的元素。例如。我想要数组元素为 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>>()
    );
}

但这是一个编译错误:

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}`

当我使用 c.clone() != 0 时,它可以工作。

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

【问题讨论】:

  • 是的,更改为*c 有效。但是为什么我必须取消它呢?

标签: reference rust


【解决方案1】:

您正确解释了错误,原因是它根本没有实现。如果标准库编写者想要完成这项工作,他们必须为&amp;i32 == i32i32 == &amp;i32&amp;mut i32 == i32i32 == &amp;mut i32&amp;i32 == &amp;mut i32&amp;mut i32 == &amp;i32 实现PartialEq。然后他们必须为所有其他原始类型(i8i16u8u16u32i64u64f32f64char)。

这是PartialEq 实现的很多

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

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

【讨论】:

  • 每种类型只需要两个额外的实现——&amp;i32 == i32i32 == &amp;i32。比较 &amp;i32 == &amp;32 已经通过 deref 强制起作用,可变引用强制转换为不可变引用,因此不需要单独的实现。这对你提出的观点并没有真正的影响,但我认为它仍然值得评论。
  • 但是有自动取消引用规则。如我所见,b==32
  • 他们本可以使用宏来做到这一点:D 另一个问题,是取消引用 (*a > b) 还是借用更好? (a > &b) ?还是编译后两者都等效?
  • 我会取消引用,但优化后它们不太可能有不同的程序集。
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多