Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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)
    }
}