Rust async-std奇怪的语法为了解决读写借用的冲突
Rust async-std strange syntax in order to resolve the conflict of read-write borrowing
我正在尝试用async-std
写一个tcp服务器,为了解决读写借用检查的冲突,我发现了一个奇怪的方法:
use async_std::prelude::*;
use async_std::task;
use async_std::net::TcpListener;
use async_std::io::BufReader;
fn main() {
task::block_on(async {
let listener = TcpListener::bind("0.0.0.0:9000").await.unwrap();
let mut incoming = listener.incoming();
while let Some(stream) = incoming.next().await {
let stream = stream.unwrap();
println!("Client Addr: {:?}", stream.peer_addr().unwrap());
task::spawn( async move {
let (reader, mut writer) = (&stream, &stream); // Stange here <-----
let reader = BufReader::new(reader);
let mut lines = reader.lines();
while let Some(line) = lines.next().await {
let mut line = line.unwrap();
line.push('x');
line.push('\n');
writer.write_all(line.as_bytes()).await.unwrap();
}
});
}
});
}
奇怪:
let (reader, mut writer) = (&stream, &stream); // Stange here <-----
我按照这个方法写了一个验证程序:
fn main() {
let mut arr = vec![1, 2, 3, 4];
let (r, mut w) = (&arr, &arr);
for v in r.iter() {
if v == &2 {
w.push(5);
}
}
dbg!(arr);
}
出现错误:
error[E0596]: cannot borrow `*w` as mutable, as it is behind a `&` reference
谁能解释一下?
之所以有效,是因为 TcpStream 具有以下含义:
impl Read for TcpStream
impl Write for TcpStream
impl<'_> Read for &'_ TcpStream
impl<'_> Write for &'_ TcpStream
前两个是“正常”的,后两个是“特殊”的,可以让你做到这一点reader/writer。
例如:read()
trait 方法定义如下:
pub fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ImplFuture<Result<usize>>
当您执行 stream.read(buf)
时,您正在使用 impl Read for TcpStream
实现。因此,您正在调用 self
类型为 &mut TcpStream
的方法。
当您执行 let reader = &stream; reader.read(buf)
时,您正在使用 impl<'_> Read for &'_ TcpStream
。因此,您正在调用 self
类型为 &mut &TcpStream
的方法。
我正在尝试用async-std
写一个tcp服务器,为了解决读写借用检查的冲突,我发现了一个奇怪的方法:
use async_std::prelude::*;
use async_std::task;
use async_std::net::TcpListener;
use async_std::io::BufReader;
fn main() {
task::block_on(async {
let listener = TcpListener::bind("0.0.0.0:9000").await.unwrap();
let mut incoming = listener.incoming();
while let Some(stream) = incoming.next().await {
let stream = stream.unwrap();
println!("Client Addr: {:?}", stream.peer_addr().unwrap());
task::spawn( async move {
let (reader, mut writer) = (&stream, &stream); // Stange here <-----
let reader = BufReader::new(reader);
let mut lines = reader.lines();
while let Some(line) = lines.next().await {
let mut line = line.unwrap();
line.push('x');
line.push('\n');
writer.write_all(line.as_bytes()).await.unwrap();
}
});
}
});
}
奇怪:
let (reader, mut writer) = (&stream, &stream); // Stange here <-----
我按照这个方法写了一个验证程序:
fn main() {
let mut arr = vec![1, 2, 3, 4];
let (r, mut w) = (&arr, &arr);
for v in r.iter() {
if v == &2 {
w.push(5);
}
}
dbg!(arr);
}
出现错误:
error[E0596]: cannot borrow `*w` as mutable, as it is behind a `&` reference
谁能解释一下?
之所以有效,是因为 TcpStream 具有以下含义:
impl Read for TcpStream
impl Write for TcpStream
impl<'_> Read for &'_ TcpStream
impl<'_> Write for &'_ TcpStream
前两个是“正常”的,后两个是“特殊”的,可以让你做到这一点reader/writer。
例如:read()
trait 方法定义如下:
pub fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ImplFuture<Result<usize>>
当您执行 stream.read(buf)
时,您正在使用 impl Read for TcpStream
实现。因此,您正在调用 self
类型为 &mut TcpStream
的方法。
当您执行 let reader = &stream; reader.read(buf)
时,您正在使用 impl<'_> Read for &'_ TcpStream
。因此,您正在调用 self
类型为 &mut &TcpStream
的方法。