関数の返り値に Box
ドキュメントによると
Rustのコンパイラはあらゆる関数のリターン型に必要なスペースを知っておく必要があります。... そのトレイトの異なる実装はそれぞれ別の量のメモリを必要とするからです。
dynを利用してトレイトを返す - Rust By Example 日本語版
なるほど、参照だったらどんなサイズが入るか決まるので、必要なスペースがコンパイラもわかるよってことみたいです
本の例だと、BufReadトレイトを File.open, std::io::stdin が実装してるので利用していたということでした
Box と dyn は組み合わせて使うものなのかな〜と思って調べたら、深淵にハマりそうだったのでまた後日...
Box はヒープメモリ確保に関連
dyn は... まだようわからん
戻り値がどのような特徴を持つ型になるかどうかで変わる様子(impl Trait というものもあるそう)
少しずつ深堀っていければいいと思う
参考リンク
dynを利用してトレイトを返す - Rust By Example 日本語版
Box, スタックとヒープ - Rust By Example 日本語版
Rustのdyn Traitとimpl Traitの違いについて
安定化間近!Rustのimpl Traitを今こそ理解する - 簡潔なQ