gpt4 book ai didi

rust - 使用泛型时不能借用自己结构的成员作为可变成员

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

我有我认为相当简单的代码:

pub struct BestType<'a, T: 'a + Read + Write> {
socket: &'a T,
}

impl<'a, T: Read + Write> BestType<'a, T> {
pub fn read(&mut self, mut container: &mut [u8]) -> std::io::Result<usize> {
let mut socket = self.socket;
socket.read(&mut container)
}
}

但是当我尝试编译它时,出现以下错误:

error: cannot borrow immutable borrowed content `*socket` as mutable
--> src\lib.rs:780:9
|
780 | socket.read(&mut container)
| ^^^^^^

这是怎么回事?如果我改为使用以下代码:

pub struct BestType<'a> {
socket: &'a TcpStream,
}

impl<'a> BestType<'a> {
pub fn read(&mut self, mut container: &mut [u8]) -> std::io::Result<usize> {
let mut socket = self.socket;
socket.read(&mut container)
}
}

编译得很好。

我看不出是什么导致了差异 - 我想做的是,不是硬编码 TcpStream,而是让调用者向我传递一个同时实现了 的类型读取写入(如TcpStream!)。

rustc 1.15.0 (10893a9a3 2017-01-19)
rustc 1.15.1 (021bd294c 2017-02-08)
cargo 0.16.0-nightly (6e0c18c 2017-01-27)

最佳答案

查看您的原始代码:

pub struct BestType<'a, T: 'a + Read + Write> {
socket: &'a T,
}

impl<'a, T: Read + Write> BestType<'a, T> {
pub fn read(&mut self, mut container: &mut [u8]) -> std::io::Result<usize> {
let mut socket = self.socket;
socket.read(&mut container)
}
}

Read traitread 方法接受 &mut self。这是有道理的(即使“读取”听起来不像它会发生变异),因为例如您可能正在移动读取指针。

当您调用 socket.read() 时,类型必须是 T(这是唯一实现 Read 的类型),但是您只有对它的不可变引用。

在你的第二个版本中,你有一个明确的&TcpStream,而不是&T where T: Read。关键区别在于 Read 恰好不仅针对 TcpStream 本身实现,而且也针对 &TcpStream 实现。因此,除了能够从&mut TcpStream读取 之外,您还可以从&mut &TcpStream 中读取。这就是此版本使用 let mut socket = self.socket 编译的原因。

关于rust - 使用泛型时不能借用自己结构的成员作为可变成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427806/

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