1

我有一个结构:

pub struct Paradise {
    cstream: TcpStream,
}

用一个方法:

pub fn write_message(&mut self, code: i32, message: &str) {
    let foo = format!("{} {}\r\n", code, message);
    let _ = self.cstream.write(foo.as_bytes());
}

这很好用。这是一个 FTP 服务器,所以当我TcpStreamTcpListener::bind我那里得到一个新的服务器时:

let mut p = Paradise::new(stream);
p.start();

start在我调用的那个方法里面:

self.write_message(220, "Welcome to Paradise");

果然,我在 FTP 客户端中看到了该消息。到目前为止,一切都很好。

但后来我这样做:

let mut br = BufReader::new(&self.cstream);
loop {
    let mut buffer = String::new();
    let _ = br.read_line(&mut buffer);
    println!("{:?}", buffer);
    self.write_message(550, "Testing");
}

当我进入write_message循环内的下一个调用时:

不能*self作为可变借用,因为self.cstream也作为不可变借用 [E0502]

完整代码:

https://github.com/andrewarrow/tinted_pa​​radise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/paradise.rs

https://github.com/andrewarrow/tinted_pa​​radise/blob/169cc5f7025c417814f47a1fb3e3fc78ce4f9516/src/starter.rs

我怎样才能改变周围的东西,以便我可以write_message在循环内调用?

4

1 回答 1

4

如何将 TcpStream 提供给 BufReader,然后将其取回?

通过调用BufReader::into_inner

impl<R: Read> BufReader<R> {
    fn into_inner(self) -> R
}

展开 this BufReader,返回底层阅读器。

请注意,内部缓冲区中的任何剩余数据都会丢失。

于 2016-08-21T19:15:31.770 回答