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 }