Rust 在使用泛型时,无法将自身结构的成员借用为可变的 我有一些我认为是相当微不足道的代码: 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) } }
发生什么事了?如果我有以下代码:Rust 在使用泛型时,无法将自身结构的成员借用为可变的 我有一些我认为是相当微不足道的代码: 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) } },rust,Rust,发生什么事了?如果我有以下代码: 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.soc
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)
}
}
显然,把它改成
pub struct BestType<'a, T: 'a + Read + Write> {
socket: &'a mut 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)
}
}
pub结构BestType{
插座:&'a mut T T,
}
恳求{
pub fn read(&mut self,mut container:&mut[u8])->std::io::Result{
让mut socket=self.socket;
socket.read(&mut容器)
}
}
这简直就是全部。也就是说,我不明白为什么需要这样做,或者为什么使用泛型与不使用泛型不同
另外,在我的实际代码中,我必须使用
let-ref-mut
,而不是let-mut
,我也不完全理解这一点,但至少它可以编译!我很愿意接受一个能正确解释发生了什么的答案。查看您的原始代码:
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)
}
}
pub结构BestType{
插座:&'T,
}
恳求{
pub fn read(&mut self,mut container:&mut[u8])->std::io::Result{
让mut socket=self.socket;
socket.read(&mut容器)
}
}
的read
方法采用和mut self
。这是有道理的(即使“read”听起来不像是变异的),因为您可能正在移动一个read指针
调用socket.read()
时,类型必须是T
(这是实现read
的唯一类型),但您只能获得对它的不可变引用
在第二个版本中,您没有使用&T
(其中T:Read
),而是使用显式&TcpStream
。关键的区别在于,Read
恰好不仅为TcpStream
本身实现,而且也为&TcpStream
实现。因此,除了能够从&mut-TcpStream
读取,您还可以从&mut-TcpStream
读取。这就是为什么此版本使用let mut socket=self.socket编译的原因
pub struct BestType<'a, T: 'a + Read + Write> {
socket: &'a mut 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)
}
}
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)
}
}