如何在Rust中包装Server结构体?解决重复调用query的借用错误
Rust包装持有可变引用返回值的Server结构体问题
库中定义的结构体与Trait
我使用的第三方库包含以下定义:
struct Server<C> { c: C, } impl<C: Customization> Server<C> { type R<'s> = ResultImpl<'s, C> where Self: 's; fn query<'s>(&mut self) -> Self::R<'_> { ResultImpl(self) } } trait Customization {} struct CustomizationImpl<'c> { reference: &'c Foo, } struct Foo {} impl Customization for CustomizationImpl<'_> {} trait Result {} struct ResultImpl<'s, C: Customization>(&'s mut Server<C>); impl<'s, C: Customization> Result for ResultImpl<'s, C> {}
已知ResultImpl持有Server的可变引用这一设计特殊,但无法修改库代码。
我的包装实现尝试
我尝试包装Server结构体,编写了如下代码:
struct Wrapper<'w> { server: Server<CustomizationImpl<'w>>, } impl<'w> Wrapper<'w> { fn query(&'w mut self) -> ResultImpl<'_, CustomizationImpl> { self.server.query() } }
问题现象
直接使用Server时,多次调用query可以正常编译:
// 可编译通过 let mut server = Server { c: CustomizationImpl { reference: &Foo {} } }; server.query(); server.query();
但使用Wrapper时,多次调用query会触发编译错误:
// 无法编译 let mut wrapper = Wrapper { server: Server { c: CustomizationImpl { reference: &Foo {} } }, }; wrapper.query(); wrapper.query();
错误信息:
error[E0499]: cannot borrow wrapper as mutable more than once at a time
疑问
是否存在可行的Server结构体包装方式?
内容的提问来源于stack exchange,提问作者dextrose
相关产品推荐
相关产品推荐

