我想用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
之后,我需要将共享引用转换为借用引用,但这是不可能的。
答案 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);
}