以下の内容はhttps://shuzo-kino.hateblo.jp/entry/2024/10/23/234327より取得しました。


Ubuntu22LTSでRust言語をやる その2:変数の定義、そして所有権というやつ

Rust言語が称賛される理由の一つに「所有権」というやつがあります。
データの取り扱いを、ユーザーに意識的に行わせることで、安全性を保ちます。

実際のところ

所有権の基礎

fn main() {
    let s1 = String::from("hello");

    // 基本的な所有権の移動
    let _s2 = s1;  // s1の所有権がs2に移動。S1は空になる
    // なので、以下のような処理はコンパイルエラーがでる
    // println!("s1 = {}", s1);  // NG

    // クローン
    let s1 = String::from("hello"); //先程の所有権移動でs1が空っぽになったので新たにつっこむ必要がある
    let _s2 = s1.clone();  // データの複製
    println!("s1 = {}, _s2 = {}", s1, _s2);  // OK

    // スタックデータ(=データ長が決まっている構造)の場合
    let x = 5;
    let y = x;  //コピーされる。
    println!("x = {}, y = {}", x, y);  // OK
}

値を変更可能にする

Rubyなんかでは「破壊的操作」といって、値を根本的に変更する操作と、一時的にそうするだけの操作ってのがありました。
Rustでは更に突っ込んで、明示的に可変としていない値を変更できないという、中々強烈な仕様になっています。
先ほどの例をあげると……yの変数定義のとき、"mut"キーワードを追加してあげると良いです。

fn main() {
  //...
    let x = 5;
    let mut y = x;  //コピーされる。mutキーワードで可変として宣言
    y += 1;
    println!("x = {}, y = {}", x, y);  // OK;  x = 5, y = 6
}

まとめ

C言語で散々メモリ破壊で痛い目をみた身としては、こういった仕組みは脳死でも安全なコードを強いてくれるのは助かります。
とはいえ、文字列を足したり、数値を足したりするのも明示的にやるのは、中々に面倒。
先人によると、こういった流れも作ってる内に慣れるらしいですが……。




以上の内容はhttps://shuzo-kino.hateblo.jp/entry/2024/10/23/234327より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14