首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust async-std奇怪语法,解决读写借用冲突

Rust async-std奇怪语法,解决读写借用冲突
EN

Stack Overflow用户
提问于 2020-12-11 23:10:39
回答 1查看 69关注 0票数 0

我正在尝试用async-std编写tcp服务器,为了解决读写借用检查的冲突,我发现了一个奇怪的方法:

代码语言:javascript
复制
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 <-----我按照这个方法写了一个验证程序:

代码语言:javascript
复制
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);
}

获取错误:

代码语言:javascript
复制
error[E0596]: cannot borrow `*w` as mutable, as it is behind a `&` reference

有人能解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-20 08:02:39

这之所以有效,是因为TcpStream具有以下隐式:

代码语言:javascript
复制
impl Read for TcpStream
impl Write for TcpStream
impl<'_> Read for &'_ TcpStream
impl<'_> Write for &'_ TcpStream

前两个是“正常”的,后两个是“特殊的”,允许你做这个阅读器/写入器的把戏。

例如:read()特征方法定义如下:

代码语言:javascript
复制
pub fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> ImplFuture<Result<usize>> 

当您执行stream.read(buf)时,您正在使用impl Read for TcpStream impl。因此,您使用类型为&mut TcpStreamself调用该方法。

当您使用let reader = &stream; reader.read(buf)时,您使用的是impl<'_> Read for &'_ TcpStream。因此,您使用类型为&mut &TcpStreamself调用该方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65253855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档