我想在其实现之外使用自身来改变
Outer
结构,而不处理其属性。如何在 Rust 中正确实现它?有没有一种简单的方法可以同时拥有可变和不可变的引用?
这里是代码示例(也许这很牵强,但它很好地说明了我面临的问题):
use std::sync::Mutex;
#[derive(Debug)]
struct Inner {
n: i64,
factor: i64,
}
#[derive(Debug)]
struct Max {
v: i64
}
#[derive(Debug)]
struct Outer {
inners: Vec<Inner>,
max: Max,
}
fn main() {
let mutex_s = Mutex::new(Outer {
inners: vec![
Inner { n: 1, factor: 2 },
Inner { n: 2, factor: 2 },
Inner { n: 3, factor: 3 },
Inner { n: 4, factor: 3 },
],
max: Max { v: 5 },
});
let mut s = mutex_s.lock().unwrap();
s.inners.retain(|i| i.n * i.factor < s.max.v);
println!("{:?}", s);
}
这里我收到以下错误:
cannot borrow 's' as immutable because it is also borrowed as mutable
。
我想这里我需要内部可变性,但我不确定如何正确、优化和有效地实现它。
您只是将
Mutex
放在了错误的位置,它应该位于 inners
的当前类型周围,而不是整个 Outer
struct 周围。 IE。对于您需要独立访问的每个区域,您都需要一个 Mutex
,这里只是 inners
成员:
#[derive(Debug)]
struct Outer {
inners: Mutex<Vec<Inner>>,
max: Max,
}
fn main() {
let s = Outer {
inners: Mutex::new(vec![
Inner { n: 1, factor: 2 },
Inner { n: 2, factor: 2 },
Inner { n: 3, factor: 3 },
Inner { n: 4, factor: 3 },
]),
max: Max { v: 5 },
};
s.inners.lock().unwrap().retain(|i| i.n * i.factor < s.max.v);
println!("{:?}", s);
}