Rust 基礎からマスターまで — 第3回
所有権、借用、スライスをコードにリンクする
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
Rustの所有権は、メモリをクリーンアップする人をコンパイルするときに決定する規則です。 値を移動するか、読み取りのみを借りるか、変更可能に借りるかを関数タイプに表示する。
値の移動
fn print_name(name: String) {
println!("{name}");
}
let player_name = String::from("Rose");
print_name(player_name);
//player_nameはここで再利用できません。
Stringはヒープデータを所有するので、代入や値渡し時に所有権が移動する。 オリジナルまで引き続き有効にするには、明示的に複製するか、参照を貸す必要があります。
定常参照と可変参照
fn print_name(name: &str) {
println!("{name}");
}
fn add_suffix(name: &mut String) {
name.push_str("_01");
}
let mut player_name = String::from("Rose");
print_name(&player_name);
add_suffix(&mut player_name);
&strは文字列の内容を読むためにしばらく借り、&mut Stringは値を変更するために借ります。 同じ範囲内で1つの可変参照と他の参照を同時に使用することはできません。
この制限は、読み込み中に値が変わったり、2つの場所で同時に変更されたりすることを防ぎます。
スライス
fn first_word(text: &str) -> &str {
match text.find(' ') {
Some(index) => &text[..index],
None => text,
}
}
スライスは、文字列や配列の連続した一部を所有せずに見る参照です。 String全体を必要としない関数は、&strを受け取ると、文字列リテラルとStringスライスの両方を使用できます。
参照の寿命
コンパイラは、参照がオリジナルより長く生き残らないことを確認します。 ローカル変数の参照を関数から返そうとすると、元のオブジェクトが最初に消えるのでコンパイルされません。
所有権エラーに遭遇した場合、無条件にクローンから貼り付けるよりも、値の実際の所有者が誰であるべきかを最初に決定する必要があります。 借りはコピーを避ける技術でありながら同時にアクセス権をタイプに制限する契約である。