如何在Rust中使用条件获取可变切片

时间:2019-11-20 09:55:47

标签: rust

我想用Rust中的以下代码编写类似的内容。

composer update

显然是在两次引用借阅。我知道它会导致错误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); }

您能告诉我如何在Rust中编写这种工作流程吗?我想过滤值,如果它什么都不返回,请应用另一个过滤器,并获得E0384: cannot assign twice to immutable variable s cannot assign twice to immutable variable的借阅参考。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我仍在学习Rust,但是基于一些示例,我们可以像这样克隆引用:

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);

}