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