是否有可能围绕&mut创建一个类似于&mut的包装器

时间:2019-10-26 01:50:54

标签: rust

以下代码无法编译,因为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);
}

1 个答案:

答案 0 :(得分:2)

否。

此功能的名称是“隐式重新借用”,当您传递&mut引用(编译器希望该&mut引用的寿命可能不同)时,就会发生此功能。仅当实际类型和预期类型都是&mut引用时,编译器才隐式重新借用。它不适用于generic arguments或包含&mut引用的结构。当前的Rust无法创建可以隐式重新借用的自定义类型。

另请参见