我想在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: cannot assign twice to immutable variable s cannot assign twice to immutable variable。
你能告诉我如何用铁锈写这种工作流程吗?我想过滤值,如果它什么也不返回,应用另一个过滤器并获得借用参考的Vec。
我试着使用共享引用。过滤Vec后,我需要将共享引用转换为借用引用,但这是不可能的。
发布于 2019-11-20 10:01:28
你可以写这样的东西。我同意它并不是真的很漂亮,但它很有效:
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);
}发布于 2019-11-20 10:41:56
我们可以像这样复制引用:
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);
}https://stackoverflow.com/questions/58951421
复制相似问题