gpt4 book ai didi

rust - 我如何获得一个值的所有权,将引用传递给外部 API?

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

我有一个外部类型 (protobuf:::CodedInputStream),它需要引用一个被引用的特征对象 (TcpStream as &mut Read >).

为了使用它的功能,将 TcpStream 的使用和所有权封装为内部细节。

但是,我不知道怎么做。我天真的尝试(伪 rust )

struct Connection {
stream: TcpStream,
coded_stream: CodedInputStream,
}

fn new_connection(s: TcpStream) -> Connection {
Connection {
stream: s,
// Invalid, `s` has been transferred to `stream` above
coded_stream: CodedInputStream::new(&mut s),
// Invalid, `stream` is an unresolved symbol here
coded_stream: CodedInputStream::new(&mut stream),
// Omitting and mutating fails, since `coded_stream`
// must have a value and there is no "0"-value.
}
}

我是否遗漏了一些明显的东西?这在 Rust 中通常是个坏主意吗?是否有其他模式来处理获取所有权和封装长期存在的对象?

Why can't I store a value and a reference to that value in the same struct?有一个类似的问题涉及如何重构内部类型以解决问题。在这里,CodedInputStream 不在我的控制范围内,需要一个不同的解决方案(我相信)。

最佳答案

你不能这样做,因为在 Rust 的所有权规则下它是不安全的。

这是一个自引用结构。自引用结构有两个问题:

  • 所有拥有的类型都可以随时移动到另一个内存地址,而且设计总是像 memcpy 一样简单,没有任何魔法。在您的情况下,这意味着一旦您返回 Connectionstream 的地址就会改变,并且 coded_stream 中的引用将变为悬空。

  • 借用检查器允许单独覆盖/替换结构字段。在您的情况下,这意味着它将允许 stream 被新的覆盖,从而使 coded_stream 带有释放后使用错误。

所以常规的借用检查规则不能表达同时拥有和借用的两个字段之间的特殊关系。

rental为这种情况提供一些解决方法的箱子。

关于rust - 我如何获得一个值的所有权,将引用传递给外部 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286439/

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