Rust 包装借用某物的结构

Rust 包装借用某物的结构,rust,Rust,我想用我自己的结构和函数包装一个低级的第三方API,使它更友好。不幸的是,第三方API需要在其构造函数中引用套接字,这意味着我希望我的结构“拥有”套接字(必须有人拥有它才能借用它,对吗?我希望在我的API中隐藏它作为实现细节) 第三方API如下所示: struct LowLevelApi<'a> { stream: &'a mut TcpStream, // ... } impl<'a> LowLevelApi<'a> { p

我想用我自己的结构和函数包装一个低级的第三方API,使它更友好。不幸的是,第三方API需要在其构造函数中引用套接字,这意味着我希望我的结构“拥有”套接字(必须有人拥有它才能借用它,对吗?我希望在我的API中隐藏它作为实现细节)

第三方API如下所示:

struct LowLevelApi<'a> {
    stream: &'a mut TcpStream,
    // ...
}

impl<'a> LowLevelApi<'a> {
    pub fn new(socket: &'a mut TcpStream, ... ) -> LowLevelApi<'a> {
        // ...
    }
}
我试过这个:

pub struct HighLevelApi<'a> {
    stream: TcpStream,
    low: LowLevelApi<'a>
}

impl <'a> HighLevelApi<'a> {
    pub fn new(host: String, port: u16) -> HighLevelApi<'a> {
        // Ignore lack of error checking for now
        let mut stream = TcpStream::connect(format!("{}:{}", host, port)).unwrap();
        HighLevelApi {
            stream,
            low: LowLevelApi::new(&mut stream)
        }
    }
}
pub结构HighLevelApi
}
恳求{
pub fn new(主机:String,端口:u16)->HighLevelApi板条箱似乎完成了此处所需的功能,尽管其文档和示例让人难以想象(即尝试和错误)

下面是解决这个问题的大致方法

出租{
酒吧出租酒店{
#[租金]
发布结构包装器{
流:框,

low:Lowlevelapi我认为“正确”的解决方案是让第三方API拥有套接字(它没有理由不拥有套接字),但遗憾的是,这不在今天的考虑范围之内……感谢@Jmb的提示——没有它我就无法解决这个问题。这个问题不完全是同一个问题(它不是“同一个”)我的问题不是“为什么”(我想我已经知道为什么),而是“我如何修复它”,但这非常接近。从那以后,我花了很多时间阅读和实验,我想我有一个答案。欢迎评论,为了完整性,如果有一个拥有_ref的解决方案和另一个没有外部板条箱的解决方案,那将非常好(即,
不安全
),因为很难解读租赁公司在做什么(因为它的功能非常丰富)
pub struct HighLevelApi<'a> {
    stream: TcpStream,
    low: LowLevelApi<'a>
}

impl <'a> HighLevelApi<'a> {
    pub fn new(host: String, port: u16) -> HighLevelApi<'a> {
        // Ignore lack of error checking for now
        let mut stream = TcpStream::connect(format!("{}:{}", host, port)).unwrap();
        HighLevelApi {
            stream,
            low: LowLevelApi::new(&mut stream)
        }
    }
}