gpt4 book ai didi

rust - 是否可以在 &mut 周围创建一个包装器,其作用类似于 &mut

转载 作者:行者123 更新时间:2023-11-29 08:06:59 27 4
gpt4 key购买 nike

以下代码编译失败,因为 MutRef 不是Copy。无法复制,因为&'a mut i32 不是Copy。有什么方法可以让 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);
}

最佳答案

没有。

此功能的名称是“隐式重新借用”,它发生在您传递一个 &mut 引用时,编译器期望一个可能不同生命周期的 &mut 引用。只有当实际类型和预期类型都是 &mut 引用时,编译器才会隐式地重新借用。它不适用于 generic arguments或包含 &mut 引用的结构。在当前的 Rust 中没有办法创建可以隐式重新借用的自定义类型。有一个 open issue关于这个限制可以追溯到 2015 年,但到目前为止还没有人提出任何解除它的方法。

您始终可以实现自己的方法来显式重新借用:

impl<'a> MutRef<'a> {
// equivalent to fn reborrow(&mut self) -> MutRef<'_>
fn reborrow<'b>(&'b mut self) -> MutRef<'b> {
MutRef {v: self.v}
}
}

fn wrapper() {
let mut s: i32 = 9;
let mut q = MutRef{ v: &mut s };
wrapper_use(q.reborrow()); // does not move q
wrapper_use(q); // moves q
}

另见

关于rust - 是否可以在 &mut 周围创建一个包装器,其作用类似于 &mut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58567431/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com