以下代码无法编译,因为MutRef不是Copy
。由于&'a mut i32
不是“复制”,因此无法将其复制。有什么办法可以使MutRef与&'a mut i32
类似的语义?
这样做的动机是能够将大量函数参数打包为一个结构,以便可以将它们作为一个组进行传递,而不必单独传递。
struct MutRef<'a> {
v: &'a mut i32
}
fn wrapper_use(s: MutRef) {
}
fn raw_use(s: &mut i32) {
}
fn raw_ref() {
let mut s: i32 = 9;
let q = &mut s;
raw_use(q);
raw_use(q);
}
fn wrapper() {
let mut s: i32 = 9;
let q = MutRef{ v: &mut s };
wrapper_use(q);
wrapper_use(q);
}
答案 0 :(得分:2)
否。
此功能的名称是“隐式重新借用”,当您传递&mut
引用(编译器希望该&mut
引用的寿命可能不同)时,就会发生此功能。仅当实际类型和预期类型都是&mut
引用时,编译器才隐式重新借用。它不适用于generic arguments或包含&mut
引用的结构。当前的Rust无法创建可以隐式重新借用的自定义类型。