【问题标题】:Removing unnecessary function from Rust echo server从 Rust 回显服务器中删除不必要的功能
【发布时间】:2014-12-03 15:05:41
【问题描述】:

这段代码:

use std::io::{TcpListener, TcpStream};
use std::io::{Acceptor, Listener};

fn main() {
    let listener = TcpListener::bind("127.0.0.1", 5555);

    // bind the listener to the specified address
    let mut acceptor = listener.listen();

    // accept connections and process them, spawning a new tasks for each one
    for stream in acceptor.incoming() {
        match stream {
            Err(e) => { /* connection failed */ }
            Ok(stream) => {
                // connection succeeded
                spawn(proc() {
                    let mut buf: [u8, ..1024] = [0, ..1024];
                    loop {
                        let len = stream.read(buf);
                        let _ = stream.write(buf.slice(0, len.unwrap()));
                    }
                })
            }
        }
    }
}

失败:

    Compiling chat v0.1.0 (file:///home/chris/rust/chat)
src/chat.rs:19:35: 19:41 error: cannot borrow immutable captured outer variable in a proc `stream` as mutable
src/chat.rs:19                         let len = stream.read(buf);
                                                 ^~~~~~
src/chat.rs:20:25: 20:31 error: cannot borrow immutable captured outer variable in a proc `stream` as mutable
src/chat.rs:20                         stream.write(buf.slice(0, len.unwrap()));
                                       ^~~~~~
error: aborting due to 2 previous errors
Could not compile `chat`.

但如果我将代码更改为:

                spawn(proc() {
                    fn handle(mut stream: TcpStream) {
                        let mut buf: [u8, ..1024] = [0, ..1024];
                        loop {
                            let len = stream.read(buf);
                            let _ = stream.write(buf.slice(0, len.unwrap()));
                        }
                    }
                    handle(stream);
                })

有效。

有没有办法删除这个handle 函数?

【问题讨论】:

  • Ok(stream) 更改为Ok(mut stream)
  • 感谢@Levans - 将此作为答案,我会接受。

标签: rust


【解决方案1】:

您的代码中的棘手点在于您的模式。当你写这样的东西时:

match foo.bar() {
    Some(value) => { ... },
    _ => {}
}

您正在声明一个新变量(在我的示例中为value)并将选项的内容移入其中。它实际上相当于:

let value = foo.bar().unwrap();

所以在这种情况下,没有什么禁止用

声明它是可变的
match foo.bar() {
    Some(mut value) => { ... },
    _ => {}
}

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 2017-01-19
    • 1970-01-01
    • 2020-08-26
    • 2016-03-09
    • 2018-11-25
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多