如何在Rust中获取具有条件的可变切片

3

我想用Rust编写类似下面代码的东西。

fn main() {
    let mut v: Vec<i64> = vec![1, 2, 3, 4, 5];
    let mut s: Vec<&mut i64> = v
        .iter_mut()
        .filter(|val| **val < 2_i64)
        .collect();
    if s.len() == 0 {
        s = v
            .iter_mut()
            .filter(|val| **val > 2_i64)
            .collect();
    }
    *s[0] = 0;
    println!("{:?}", v);
}

显然是在两次引用中进行借用。 我知道这会导致错误,E0384:无法将可变变量s分配两次,无法将不可变变量分配两次

您能告诉我如何在Rust中编写此类工作流程吗? 我想过滤值,如果返回结果为空,则应用另一个过滤器并获取借用参考的 Vec

我尝试使用共享引用。 过滤了 Vec 后,我需要将共享引用转换为借用引用,但这是不可能的。


你确定要使用可变引用来引用 i64 吗?你可以直接创建一个带有数字的新向量。 - Boiethios
你想在之后对 v 做什么?解决方案有些取决于它。 - hellow
实际上,我正在实现Vecstruct。但为了简化它,我使用了i64。我想在应用过滤器后更改结构字段。 - fx-kirin
为什么不使用 for 循环? - Boiethios
因为我需要知道数组是否有元素,所以我需要两个循环。非常感谢您的答复,这正是我想知道的。 - fx-kirin
2个回答

2
您可以这样编写。我同意它不是很美观,但它有效:

您可以这样编写。我同意它不是很美观,但它有效:

fn main() {
    let mut v = vec![1_i64, 2, 3, 4, 5];
    let s: Vec<_> = v.iter_mut().filter(|&val| *val < 2).collect();
    let mut s = if s.len() == 0 {
        v.iter_mut().filter(|&val| *val > 2).collect()
    } else {
        s
    };

    *s[0] = 0;
    println!("{:?}", v);
}

|&&mut val| val < 2 - Deadooshka
我不确定使用 |&&val||&val| 还是 |val| 更好。你能在这里留下你的意见吗? - fx-kirin

0
我们可以像这样克隆引用:
fn main() {
    let mut v: Vec<i64> = vec![1, 2, 3, 4, 5];
    let mut t = v.clone();
    let mut s: Vec<&mut i64> = v.iter_mut().filter(|val| **val < 2_i64).collect();
    if s.len() == 0 {
        s = t.iter_mut().filter(|val| **val > 2_i64).collect();
    }
    *s[0] = 0;
    println!("{:?}", v);
}

只要可能,您应该避免克隆。 - fx-kirin
@fx-kirin 不是要反驳,但克隆后主体之后会失去引用。那么我们为什么要避免使用它呢?你能解释一下吗? - Kartikeya Sharma
为了内存效率。 - fx-kirin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接