我想得到一个条件为真的数组中的元素.例如我想要数组元素为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会抱怨它无法将borrow 与整数与整数进行比较.我不明白为什么不可能.

推荐答案

您正确地解释了错误,原因是它根本没有实现.如果标准库编写人员想要实现这一点,他们必须为&i32 == i32i32 == &i32&mut i32 == i32i32 == &mut i32&i32 == &mut i32&mut i32 == &i32实现PartialEq.然后,他们必须对所有其他原始类型(i8i16u8u16u32i64u64f32f64char)执行此操作.

这是PartialEq个实现中的lot个.

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

(如果你来自C++,关键是要理解,语法上,borrow 比指针更像指针.只有方法调用语法具有自动DeEF特性.)

Rust相关问答推荐

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

为什么类型需要在这个代码中手动指定,在rust?

如何格式化传入Rust中mysql crate的Pool::new的字符串

为昂贵的for循环制作筛子

我如何制作一个变异迭代器来锁定内部数据直到删除?

Const 上下文:从 init 函数创建具有 const 通用长度的数组

Rust,如何从 Rc> 复制内部值并返回它?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

根据掩码将 simd 通道设置为 0 的惯用方法?

Rust FFI 和 CUDA C 性能差异

部署Rust发布二进制文件的先决条件

`tokio::pin` 如何改变变量的类型?

如何在 Emacs Elisp 中获得类似格式化的 LSP?

Rust 引用元组和引用元组

当我不满足特征界限时会发生什么?

用逗号分隔字符串,但在标记中使用逗号

是否有适当的方法在参考 1D 中转换 2D 数组

实现不消费的迭代器

以下打印数组每个元素的 Rust 代码有什么问题?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())