You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:05:33