👵
Rustで湯婆婆を作ってみた
元ネタ様
実際に動かすとこんな感じ
コードはこちら
ほとんどThe bookを参考にしました。
(io
やrand
、変数を 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
)
}
参考文献
Discussion
typo (?)
名前を受け取る
char → &str
名前を奪う
length() → len()
kanarusさんコメント有難うございます!めちゃくちゃtypoです…!更新しました!ご指摘有難うございます!