modern-utopia.net In the beginning was the name, where ideas take shape.
プログラミング

Rustの学習

2026-08-08

週末で認証サービスのRust化を試みる。
まずは公式ドキュメントで大まかに言語を学ぶ

The Rust Programming Language 日本語版

第一章から、第4章までソース組みながら読み進めていく。
作成したソースは下記の通り。

use rand::Rng;
use std::cmp::Ordering;
use std::io;

/* 数当てゲーム */
fn main() {
    println!("数当てゲーム!");

    let secret_number = rand::thread_rng().gen_range(1..=100);

    // println!("シークレットナンバーは: {secret_number}");

    loop {
        println!("あなたの予想を入力してください。");

        let mut guess = String::new();
        io::stdin()
            .read_line(&mut guess)
            .expect("行の読み込みに失敗しました。");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("数値を入力してください。");
                continue;
            }
        };

        println!("あなたの予想は: {guess}");

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("小さい!"),
            Ordering::Greater => println!("大きい!"),
            Ordering::Equal => {
                println!("正解");
                break;
            }
        }
    }
}
/* 所有権 */
fn main() {
    // 所有権:ムーブ
    let mut s1 = String::from("hello");
    let s2 = s1.clone(); // 単純に渡そうとするとムーブが発生するのでクローンが必要
    s1.push_str(", world!");
    println!("s1 = {}, s2 = {}", s1, s2);

    let s3 = String::from("関数にムーブした値");
    takes_ownership(s3);
    // println!("{} destroy", s3);  // このコードは失敗する

    // 所有権:コピー
    let x = 5;
    let y = x; // 既知のサイズを持つ型はクローンは不要
    println!("x = {}, y = {}", x, y);

    let z = 5;
    makes_copy(z);
    println!("コピー後の値: {}", z);

    // 所有権:リターン
    let (s4, len) = return_ownership();
    println!("{}, 文字のバイトサイズ={}", s4, len);

    // 所有権:借用:参照の作成
    let s5 = String::from("参照渡し");
    let len2 = cal_length(&s5);
    println!("「{}」の長さは、{}", s5, len2);

    // 所有権:借用、可変参照
    let mut s6 = String::from("可変参照渡し");
    let s7 = borrowing2(&mut s6);
    println!("{}", s7);
}

/* 所有権:ムーブ */
fn takes_ownership(s: String) {
    println!("{}", s);
}

/* 所有権:コピー */
fn makes_copy(i: i32) {
    println!("{}", i);
}

/* 所有権:リターン */
fn return_ownership() -> (String, usize) {
    let some_string = String::from("関数から返された値");
    let length = some_string.len();
    (some_string, length) // returnは省略できる
}

/* 所有権:借用、参照の作成 */
fn cal_length(s: &String) -> usize {
    // &をつけると参照できるアドレスで受け渡し
    s.len()
}

/* 所有権:借用、可変参照 */
fn borrowing2(s: &mut String) -> String {
    s.push_str("を変更");
    s.to_string()
}