Rust: イテレータメソッドの by_ref() と take_while() の組み合わせには気をつけようという話(てかドキュメントを読もう)

事の発端

take_while というイテレータメソッドがある。 doc.rust-lang.org 詳しい説明は公式に任せるとして、 take_while した後の残りが欲しかったが take_whileself を取るので 一回使ったら再利用できない。by_ref を使ってrestを取ろうとした。が、take_whileイテレータが止まる条件を満たしたであろう最後に舐められた要素はdropされるという話でした。 例は下の playground で

play.rust-lang.org

まとめ

この記事書いてる時に

Because take_while() needs to look at the value in order to see if it should be included or not, consuming iterators will see that it is removed

の言及に気づいたのでドキュメントはちゃんと読みましょう

オチ