プログラムのお勉強メモ

プログラムの勉強メモです. Python, Rust, など.

実践Rustプログラミング入門 2日目

2日目の勉強

  • 所有権と借用

所有権と借用

  • 難しい
  • いままで謎にコンパイルが通らなかったことがあるのは一部これが原因
    • & は 値を不変な形で貸す
    • &mut は値を可変な形で貸す(1度きり, 2度やるとコンパイルエラー)

所有権の問題でコンパイルできないコード

fn main() {
    let data = format!("{}", "Hello, world");
    print_data(data); // 所有権が print_data に移る

    println!("{}", data); // 所有権が printt_data に移っているので使えない
}

fn print_data<T: std::fmt::Debug>(t: T) {
    println!("{:?}", t);
}

所有権を解決したコード1

  • return することで所有権を返してもらう
  • 処理の中でほかに return
fn main() {
    let mut data = format!("{}", "Hello, world"); // 可変可能な変数で宣言
    data = print_data(data); // 所有権が print_data に移る

    println!("{}", data); // return で 所有権が返ってきているのでコンパイルできる
}

fn print_data<T: std::fmt::Debug>(t: T) -> T {
    println!("{:?}", t); 
    t // return
}

所有権を解決したコード2

fn main() {
    let data = format!("{}", "Hello, world");
    print_data(&data); // &を付けて, 所有権は main が持ちつつ, 参照渡しする

    println!("{}", data); // 所有権は main のままなので使える
}

fn print_data<T: std::fmt::Debug>(t: &T) {
    // & を付けて参照で受けられるようにする
    println!("{:?}", t);
}

所感

  • Rust っぽさを出すにはこのあたりが重要になってくるのかな、と思った
  • Python を書く時に Rust の構文が出てくるようになってきてしまった
  • 少しでも時間を取って勉強する習慣をつけていきたい

参考文献