現象
struct Note { name:String, } let name = note.name.trim(); println!("{}", name);
こういうコードを書いたら以下のようなエラーがでた。
Rust: temporary value is freed at the end of this stat
原因
rust - Temporary value is freed at the end of this statement - Stack Overflow
こちらに書いてありました。
原因は&strはStringの参照であり、&strはStringが生きている限り参照可能なのに、Stringが死んでしまったため、エラーが起こりました。
note.nameはStringですが、それをtrimすると&strになります。note.nameはどこにも変数束縛されていないので、trim後の値である&strは参照先がわからずエラーとなります。
- note.nameはString
- trimの値は&strでnote.nameの参照
- note.nameはどこにも束縛されていないので一時的な値で消える
- trimの値はnote.nameの参照なのに、note.nameがない -> エラー
解決方法
一旦変数にする
let tmp_name = note.name; let name = note.name.trim();
所有権を持つ
let name = note.name.trim().to_string(); or let name = note.name.trim().to_owned(); など
(デメリットは調査中・・・)
どちらが良いのでしょうか・・・?
パフォーマンス差はないのでしょうか?
要約
&str使うときは大元のStringが死んではならない!