スマートポインタの役割
Rustは関数ローカルの変数を参照として返すことができない
impl Reader { fn new(path: impl AsRef<std::path::Path>) -> Reader { let file = std::fs::File::open(path).unwrap(); Reader { file: file, } } fn read_bytes(&mut self, len: usize) -> &[u8] { let mut bytes = vec![0_u8; len]; self.file.read(&mut bytes); &bytes } /* error[E0515]: cannot return reference to local variable `bytes` | 22 | &bytes | ^^^^^^ returns a reference to data owned by the current function */ }
スマートポインタを使ってスライスを包み込んで返すようにする。 こうすることによって、値がヒープ上に確保され、その参照を渡すことが出来る。
fn read_bytes(&mut self, len: usize) -> Vec<u8> { let mut bytes = vec![0_u8; len]; self.file.read(&mut bytes); bytes }
標準スタンダードにおける例
std::fs::File
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
スライスを受け取るのではなく、Vecで受け取っている。