1.2K Views
April 06, 25
スライド概要
2025/04/06(日)に行われた「第74回 RustLadies & GTUGGirls 「はじめてのRust」」で行ったハンズオン資料です。
https://gtuggirls.connpass.com/event/349267/
Rustと可愛い服が好き!RustLadies運営🦀❤️
はじめての Rust! 〜Rust いいかも!と思ってもらう 90 分〜 2025 年 4 月 6 日 第 74 回 RustLadies & GTUGGirls 「はじめての Rust」 ふみふみ
今日のゴール 「Rust、思ったよりちょっと楽しいかも!」 「また機会があれば触ってみたい!」 と思ってもらうこと!
一緒に楽しむための心がまえ 何となくわかった、で OK! ふみふみも勉強中です!
Rust とは 特徴 事例 できること
Rust とは 安全性と信頼性に優れた言語! 静的型付け/コンパイル時エラー 所有権(Ownership)でメモリ安全
どこで使われてる?
Firefox Shipping Rust in Firefox Firefox に組み込まれた Rust Dropbox Lossless compression with Brotli in Rust for a bit of Pied Piper on the backend - Dropbox Cloudflare Serverless Rust with Cloudflare Workers
Rust でできること CLI ツール(例:ripgrep) WebAssembly(wasm) ゲーム・アプリ開発 IoT や組み込み分野にも! キーワード:「安全」「速い」
環境の確認 Rust インストール済みですか? ( rustc --version ) VSCode の方: rust-analyzer は入っていますか? https://www.rust-lang.org/ja/tools
環境の確認 $ rustc --version $ cargo --version
Hello, World!
Rust での開発の流れ 1. コード記述 2. コンパイル 3. 実行 それぞれのコマンドは一緒にやっていきましょう!
Hello, World!をしてみよう .rs ファイルを作ってみよう $ mkdir hello_rust $ cd hello_rust $ touch main.rs
main.rs
に記述しよう
fn main() {
println!("Hello, World!");
}
実行しよう 1. rustc でコンパイル 2. ./main で実行 $ rustc main.rs // 実行ファイルが作られる $ ls main main.rs $ ./main Hello, World!
cargo を使ってみよう!
Cargo とは Rust のビルドシステム & パッケージマネージャ Mac の Homebrew Linux の apt JS/TS の yarn, npm Java の Maven Central Repository
よく使う Cargo コマンド cargo run // 今日1番使います! cargo check // コンパイルが通るかのチェック // 実行ファイルは作らない cargo fmt // コードの整形
数当てゲームを作ってみよう! まずは実際のゴールを見てみましょう!
数当てゲームの作り方 1. rand クレートを追加( cargo add rand ) 2. ランダムな数(1~100)を生成 3. 標準入力で数字を受け取る( io::stdin().read_line(&mut guess) ) 4. 文字列 → 数値に変換( .trim().parse() ) 5. マッチングで大小を判定 → ヒントを表示 6. loop で繰り返し → 当たったら終了!
実際のコード
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {guess}");
}
}
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
1 つ 1 つ一緒に書いていきましょう!
cargo でプロジェクトを作ろう cargo new guessing_game cd guessing_game src/main.rs を開きましょう! 既に Hello, World が書かれています
クレートのインポート はじめに、使用するライブラリ(クレート)を記述します。 use でインポートできます。 use rand::Rng; use std::cmp::Ordering; use std::io;
ここから先は、main()に記述します! main()を定義 fn main() { println!("Guess the number!"); }
秘密の数字を作る 1 以上 100 以下の数字の中で、 答えとなる数字をランダムに作成します。 (=を外すと、1~99 の間で作成されます) // main()の中 let secret_number = rand::thread_rng().gen_range(1..=100); // 1..=100 : 1以上100以下の間
入力を受け取る
ここから先は、 loop{} 内に書いていきます!
io:stdin() で標準入力を受け取ることができます。
受け取った値を、変数に入れます。
loop {
// ループ開始
println!("Please input your guess.");
let mut guess = String::new();
// 空文字を変数 guess へ
io::stdin()
.read_line(&mut guess) // 成功時の処理
.expect("Failed to read line"); // 失敗時の処理
文字列型 → 数字型に変換
文字列で受け取っているので、このままでは数字の比較ができません!
そこで、数字の形に変換して、数の大小を比較できるようにします。
let guess: u32 = match guess.trim().parse() {
// 文字列で受け取ったものをu32型に変換
Ok(num) => num,
// 成功したら、numという変数へ
Err(_) => continue,
// 失敗したら、次のループへ
};
ここまで順調そうですか? 必要であれば、お手洗い、水分補給、おやつタイムしましょう! ストレッチもぜひ!
ユーザーの入力を確認 "{変数名}" で、変数の値を含めた文字列にできます println!("You guessed: {guess}");
ユーザーの入力を元に結果を比較 答えの数字と比較して、正解か不正解かを判定します。 1. 大きい 2. 小さい 3. 等しい(正解!)
それぞれで、表示するメッセージを定義します。
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
// 正解より小さい時
Ordering::Greater => println!("Too big!"),
// 正解より大きい時
Ordering::Equal => {
println!("You win!");
break;
// 正解と等しい時
// ループ終了
}
}
最終的なコード
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..=100);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {guess}");
}
}
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
実際に遊んでみましょう〜! アレンジも Ok! メッセージを日本語にする ヒントを与える(あといくつ足せばいい?など) 数字の範囲を小さく(大きく)する
まとめ 今日みなさんができるようになったこと Rust とはどんな言語か Rust の開発はどんな流れか Rust での Hello, World のやり方 パッケージ管理・ビルドツール「cargo」 の使い方 数当てゲームをつくる 「Rust、悪くないかも…?」と思っていただけたら嬉しいです!
参考文献 Rust 公式:https://www.rust-lang.org/ja The Rust Book:https://doc.rust-lang.org/book/ ベテランエンジニアも意外と知らない「パッケージ管理システムの仕組み」 #パ ッケージマネージャー - Qiita コンセプトから理解する Rust:書籍案内|技術評論社
アンケートにご協力お願い します...!
ご参加ありがとうございました! お疲れ様でした! またぜひ Rust で一緒に遊びましょう! RustLadies でお待ちしています!