👵

Rustで湯婆婆を作ってみた

2024/08/13に公開2

元ネタ様

https://qiita.com/Nemesis/items/c7192a7c510788d2cba2

実際に動かすとこんな感じ

コードはこちら

https://github.com/2323-code/yubaba-rust

ほとんどThe bookを参考にしました。
iorand、変数を String::new()で宣言するなど)

main()

start_yubaba()を呼び出すだけです。

fn main() {
    start_yubaba(); // start_yubaba()を呼び出すだけ
}

start_yubaba()

今回のメインとなる部分です。

名前を受け取る

まず契約書に名前を書いてもらいます。
はじめに名前を入れる変数origin_nameを宣言し、そこに標準入力で受け取った値を入れます。

fn start_yubaba() {
    let mut origin_name = String::new();
    println!("契約書だよ、そこに名前を書きな。");
    io::stdin()
        .read_line(&mut origin_name)
        .expect("Failed to read line");

ただ、受け取ったままですと改行文字が入ってしまいます。
(例えば「Alice」と入力した場合、「Alice\n」となります)

そのため、trim()を使って前後の空白や改行文字を削いでいます。
trim()は&strを返してしまうため、to_string()でString型にします。

    origin_name = origin_name.trim().to_string();
    println!("ふん、{}というのかい、贅沢な名だね", origin_name);

名前を奪う

ここでは「名前の文字数を取得する」「文字数の範囲内で、ランダムな値を1つとる」という2段階の作業をしています。

RustではString型にlen()を使うと、バイト数を返してしまう
ため、chars().count()を使って文字数を取得しています。

    let name_length = origin_name.chars().count();
    // println!("{}", name_length);

    let new_name_index = rand::thread_rng().gen_range(0..name_length);
    // println!("{}", new_name_index);

新しい名前とするインデックスが得られました。新しい名前を与えるまで、あと少しです。

新しい名前を与える

最後に新しい名前を出力します。
Rustではインデックスを指定してString型を返すことができないので、chars().nth().unwrap()をして実行しています。

    let new_name = origin_name.chars().nth(new_name_index).unwrap();

    println!(
        "今からお前の名前は{}だ、いいかい、わかったら返事をするんだ!{}!!",
        new_name, new_name
    )
}

参考文献

https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html
https://rs.nkmk.me/rust-str-nth-char/#h2_0

Discussion

kanaruskanarus
typo (?)

名前を受け取る

trim()はcharを返してしまう

char → &str


名前を奪う

RustではString型にlength()を使うと

length() → len()

ふみふみふみふみ

kanarusさんコメント有難うございます!めちゃくちゃtypoです…!更新しました!ご指摘有難うございます!