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をコピーする必要がなくなる。)