Rustで開発していると、Cloneに頼りたくなる場面は多い。
しかし、大きなデータをCloneすることはパフォーマンス低下につながる。
この記事では、into_iter()を活用してclone()なしでVec内の要素を返す方法を紹介する。
Boardという構造体が入っているVec<Board>から、iter().min()で最小値を直接取得し、そのまま返す例を使って説明する。
fn get_unique_board(board: &Board) -> Board {
let boards: Vec<Board> = board.get_all_symmetries();
boards.iter()
.min() // -> Option<&board>
.unwrap() // -> &Board
.clone() // -> Board (ここで clone() が必要になっている)
}
min()の返り値は、Boardではなく&Boardである。
そのままBoardを返したいならclone()が必要になる。
into_iter()を使えば、Vec<Board>の所有権を直接イテレータに渡すことができる。結果的に、min()で返ってくるのはBoard自体となり、clone()が不要になる。
fn get_unique_board(board: &Board) -> Board {
let boards: Vec<Board> = board.get_all_symmetries();
boards.into_iter() // 所有権を移動
.min() // -> Option<Board>
.unwrap() // -> Board
}
このようにすることで、Vecの中のBoardを直接返す事ができる。
(Vecの中のBoardをコピーする必要がなくなる。)

