スマートポインタの役割

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で受け取っている。