The Rustの本によると:
Rustの各値には、その所有者と呼ばれる変数があります。一度に1人の所有者しか存在できません。所有者がスコープ外になると、値は削除されます。
rust-lang.orgによると:
静的アイテムは、プログラムの最後にドロップを呼び出しません。
このSOの投稿を読んだ後、以下のコードfoo
を考えるとy
、これ&y
は「文字列リテラルは文字列スライスである」ためと同等の変数がそのと呼ばれる値であることがわかりowner
ます。あれは正しいですか?または、静的アイテムには所有者がいませんか?
let x = String::from("foo"); // heap allocated, mutable, owned
let y = "foo" // statically allocated to rust executable, immutable
所有されているものとは異なりString
、文字列リテラルは移動され.rodata
ないので、おそらく実行可能ファイルに格納されているためだと思います。
fn main() {
let s1 = "foo"; // as opposed to String::from("foo")
let s2 = s1; // not moved
let s3 = s2; // no error, unlike String::from("foo")
}
更新:The Rustの本によると:
これらのアンパサンドは参照であり、所有権を取得せずに値を参照できます...所有権を持たない別のデータ型はスライスです。
文字列リテラルは文字列スライス(&str
)であるため(上記の引用を参照)、論理的には所有権がありません。理論的根拠は、コンパイラーが既知のサイズのデータ構造を必要とするということのようです。参照:
let s1: str = "foo"; // [rustc E0277] the size for values of type `str` cannot be known at compilation time [E]
文字列スライス参照(&str
)は、それが指す文字列スライスを所有せず、それを借用します。オブジェクトへの不変の参照をいくつか持つことができます。そのため、2番目のコードサンプルは正しく、ボローチェッカーはそれを喜んで受け入れます。
'static
ライフタイムを持つ型には所有者がいない、またはmain
関数外の何かが所有していると言えると思います。所有者は、所有するオブジェクトの存続期間が終了したときにのみ重要になります(所有している場合は、リソースを解放する必要があります)。参考までに、寿命だけが重要です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加