Я не могу понять, почему этот код компилируется:
use std::io::{Read, BufRead};
trait ReadString {
fn read_null_terminated_string(&mut self, max_size: u64) -> std::io::Result<String>;
}
impl<R> ReadString for R
where
R: BufRead,
{
fn read_null_terminated_string(&mut self, max_size: u64) -> std::io::Result<String> {
let mut buf = Vec::new();
self.take(max_size).read_until(0, &mut buf)?;
Ok(String::from_utf8_lossy(&buf).to_string())
}
}
Насколько я могу судить BufRead это не Copy, а BufRead::take() это:
fn take(self, limit: u64) -> Take<Self>
where
Self: Sized,
{
Take { inner: self, limit }
}
cannot move out of `*self` which is behind a mutable reference
move occurs because `*self` has type `R`, which does not implement the `Copy` trait
Так почему я не получаю эту ошибку с BufRead?
Не компилируется play.rust-lang.org/…
Вы разблокируете 3-й уровень Rust, self может быть изменяемой ссылкой, поздравляю :p, поэтому я понятия не имею, что такое другие уровни, так как я только что это придумал.