テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(rust report) 寿命は気にせずownしてカジュアルに使う

Rustを書こうと思った時, いきなり完璧なRustコードを書こうと思うとRustは入門すら不能になる. 特に寿命についていきなり最適を目指そうとするのは, かなり疲れる. おそらく寿命に関するコンパイルエラーによって統合か頭髪のいずれかを失う. そこでみなさんにやすらぎのツイートを紹介する.

おれもこれは思っていて, 「最悪ownしてしまえば寿命に悩まされることはない」ということが分かっていれば, Rustに入門するのはそんなに難しくない. これは例えるならば, 泳ぐのが怖いと思ってる人でも, 最悪立ってしまえば安全と分かっていれば泳ぐことが怖くなくなるようなものだ.

もちろん, 可変を前提としたデータ構造などロジック的にコピーしてはならないオブジェクトが存在することはあるが, そういうものはそもそもコピーするコストが膨大だからソフトウェア設計上可変になってるのであって, 不変なオブジェクトは大抵は小さく, 頻繁にコピーしていったところでソフトウェア全体が急激に遅くなるということはありえない.

例えば, Rustは文字列について&strとStringの選択があるが, これがまぁまぁのややこしさを生むことがある. だったら最初からto_stringしてしまってownしてしまう方が楽だと思う. 小さいオブジェクトは作っては消えてを繰り返すことが多いから, 変に参照でがんばろうとすると寿命関連でコンパイルエラーになる可能性が高いのだと考えている. 副次的な効果として, structに寿命パラメータがついたり, ぐちゃぐちゃになることを防ぐことが出来て, コードがわかりやすくなるメリットもある.

// to_stringはここに帰着する
impl<'a> From<&'a str> for String {
    fn from(s: &'a str) -> String {
        s.to_owned()
    }
}

もし, ownしていることが性能上問題だと分かったら, その時に直せばいい. 最適な寿命パラメータを与えていくことは, おそらく機械的に出来るし, なにより, ロジックを壊すことはコンパイラが防いでくれるから安全にリファクタリングすることが出来る.

でもおれとしてはこんなことは本来Rustの言語本体ががんばることではないのかと思う. 例えばRustにはCow型がある. これは本当に必要になるまではownしませんという型だが, これをデフォルトになってないのはなぜだろうか.