🦀

Rustの勉強

2024/01/28に公開

Rustの勉強1日目
は〜?と思ったところのメモ

文字列の違い

pythonの場合

text1 = "Hello"
text2 = text1
print(text1)
print(text2)

Rustの場合

fn main(){
let s1 = String::from("Hello");
let s2 = s1;
println!("{}", s1)
println!("{}", s2)
}

この方法ではエラーになります...
正しくは

fn main() {
    let x = "Hello";
    let y = x;
    println!("{}", x);
    println!("{}", y);
}

なぜ?

  • メモリの確保方法が違う
    このコードがエラーにならないのは、x が文字列リテラルで、String型のような動的なメモリ確保が発生していないからです。Rustでは、コピー可能で固定サイズの型については、所有権の移動ではなく単なる値のコピーが行われます。文字列リテラルは不変で固定サイズであるため、コピーが可能です。
特徴 文字列リテラル String型
所有権の移動 コピー可能(不変で固定サイズ) 移動可能(可変で可変サイズ)
メモリの割り当て 静的領域(コンパイル時に既知) ヒープ領域(実行時に動的に確保)
文字列操作の制限 制限あり(不変、固定サイズ) 制限なし(可変、可変サイズ)
コピーと所有権の挙動 単なる値のコピーが行われる 所有権の移動が発生する

再代入

pythonの場合

n = 1
print(n)
n = 3.14
print(n)

Rustの場合

fn main(){
    let mut n = 1;
    println!("{}", n);
    n = 3.14;
    println!("{}", n)
}

これはエラーになります...
正しくは

// 型の再宣言
fn main(){
    let mut n = 1;
    println!("{}", n);
    let n = 3.14;
    println!("{}", n)

違いはletをもう一度使っているところです。
これにより、元の n と新しい n は別々の変数として扱われ、新しい n には 3.14 の浮動小数点型の値が格納されます。この手法を「シャドーイング」と呼びます。

  • シャドーイングとは: Rustでは同じ変数名を再利用して新しい変数を導入することができます。これにより、変数の値や型を変更できます。新しい変数が導入されると、元の変数は「シャドーイングされた」と見なされます。

  • シャドーイングの特徴:

    • 新しい変数の導入は let キーワードを使用します。
    • 同じスコープ内で同じ名前の変数を再利用できます。
    • 新しい変数に異なる型や値を持たせることができます。
    • シャドーイングされた変数は再度使用されることがあります。
  • 利点:

    • シャドーイングを利用すると、変数の型を変更する際に新しい変数を導入できるため、柔軟性が向上します。
    • ループ内で同じ変数名を使いたい場合などに便利です。
岩田組

Discussion