TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Rust: temporary value is freed at the end of this stat

現象

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が死んではならない!