週末で認証サービスの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()
}