1.4K Views
August 27, 24
スライド概要
2024/08/25に開催された「RustLadies #1 Rustを触ってみよう! 」のハンズオンで使用した資料です!
https://rustladies.connpass.com/event/326725/
RustLadiesの中の人 / PyLadies メンバー
Rust を触ってみよう! 2024/08/24 RustLadies#1 ハンズオン ふみふみ x: @2323_code GitHub: 2323-code
今日のゴール Rust、自分にもかけるかも! と思ってもらうこと
対象者 Rust 書いたことがない方 他の言語で開発経験がある方
ちなみに、 Rust 今日初めて書くよ〜って方は...?
ありがとうございます!
アジェンダ 1. Rust とは 2. Hello World! 3. Cargo を使ってみよう 4. 休憩 5. 数あてゲームを作ってみよう1 6. 休憩 7. 数あてゲームを作ってみよう2 8. しめ
会場案内 お菓子、飲み物気軽につまみながらで OK! エアコン寒いなどあれば、気軽におっしゃってください! お手洗いは後ろの、左曲がって突き当たりです! 一緒に楽しくコーディングしていきましょう!
Rust とは
誰もが効率的で、信頼できるソフトウェアを作れる言語 https://www.rust-lang.org/ja 高パフォーマンス メモリ効率 他の言語との統合 信頼性 型が豊富 所有権によるメモリの安全性 コンパイル時にバグが削減される 生産性 ローカルから見られるドキュメント 解決策も提示してくれるコンパイラ
Rust で作れるもの CLI ツール Java Script と組み合わせた Web アプリケーション Wasm Web バックエンド
...? 書いたほうが早いと思います。 まずは Hello World してみましょう!
Rust インストールはお済みですか? もしできていない方いたら教えてください! https://doc.rust-lang.org/book/ch01-01-installation.html https://www.rust-lang.org/tools/install に行けば OS に沿ったやり方を提示してくれます Linux or Mac: $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh Rust が正しくインストールされているかどうかを確認するには、シェルを開いて 次の行を入力します。 $ rustc --version
Hello, World! Rust のファイルの拡張子は .rs です! Hello World 用のファイル main.rs を作りましょう。 mkdir rustladies cd rustladies touch main.rs
main() を定義しよう
// main.rs
fn main() {
println!("Hello, World!");
}
ファイルを保存して、コンパイルしよう $ rustc main.rs // windowsでは .\main.exe $ ./main Hello World!
\ ようこそ、新たな Rustacean の皆様〜!!!! / Rust を書く人は Rustacean と呼ばれます。 おめでとうございます!!!
コードの解説
main()
実行可能な
Rust のプログラムで、最初に実行されるコード
println!
出力するためのマクロ
今回は引数に "Hello World!" を渡す
セミコロン ; で終了する
// main.rs
fn main() {
println!("Hello, World!");
}
コマンドの解説 rustc コンパイル 成功するとバイナリ実行可能なファイルを出力 ls -la すると見えます! $ rustc main.rs // windowsでは .\main.exe $ ./main Hello World!
とはいえ、毎回コンパイルコマンド ↓ バイナリファイルを実行、はちょっと面倒 ...
Cargo を使ってみよう
Cargo とは Rust のビルドシステム & パッケージマネージャー すごいよ Cargo さん コードのビルド、実行 ライブラリのダウンロード、ビルド プロジェクト作成
Cargo でプロジェクトを作ってみよう 一度 rustladies ディレクトリに戻って、 $ cd ../ $ cargo new hello_cargo $ cd hello_cargo cargo プロジェクトを作ってみましょう!
hello_cargo の中身を見てみよう src ソースファイル Cargo.toml パッケージの内容を示すファイル 依存関係は dependencies に記載します。
補足:クレート Rust では、コードのパッケージを crates(クレート)と呼びます。 Python: ライブラリ Java: パッケージ Ruby: gem
Cargo でビルドしてみよう $ cargo build $ ./target/debug/hello_cargo Hello, World! 実行ファイルが ./target ディレクトリに配置されます。
ビルドと実行を一気に実行しよう $ cargo run 実行ファイルの場所などを気にしなくて OK!便利!
コンパイルできるか不安になったら $ cargo check 実行ファイルを使わずに、コンパイルできるか確認できます。
Hello, World & Cargo まとめ Rust のファイルは .rs で作成できる。 基本はコンパイル → 出力された実行ファイルを実行、という流れ。 cargo を使うとコードのビルド、実行、プロジェクトの作成などができる。
数当てゲームを作ってみよう 入力〜入力結果を返すまで ①
数当てゲーム? 1 100 までの数字のうち 1 つ選ばれる ランダムで 〜 数字を回答 正解より多いか少ないか出力される 正解を当てたら終了
開発の流れ 1. cargo で数当てゲームプロジェクト作成 2. 入力された数を保存する i. 変数 ii. 例外処理 iii. 入力結果を返してみる 3. ランダム:1~100 までの数字を作る i. rand クレートを使ってみよう ii. 出力してみよう 4. ユーザーの入力と正解を比較しよう i. match 文の使用 ii. String から int 型への変換 5. ループ:何度も回答できるようにしよう i. 正解したら終了する
cargo で数当てゲームプロジェクト作成 https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html#processing-aguess cd ../ cargo new guessing_game
入力された数を保存する let で変数を作れる デフォルトは不変。 mut を作ると、値を変更できる変数にできる String::new() 空の文字列 use std::io; // 入出力ライブラリ fn main() { println!("数字あてゲームを始めるよ"); println("数字を入力してね!"); ... let mut guess = String::new(); // 変数の作成、入力の保存
例外処理 & 参照 とりあえずデフォルトで不変、でも mut で変えられるようにしているんだ な、で OK .expect() エラーがあった場合に返す内容 ... ... } io::stdin() //入力の取得 .read_line(&mut guess) //OKなら入力値を返す .expect("read lineの実行に失敗しました。");
変数を出力する
" {} " のように書く
{} の中に、変数の値を出力できる
...
println!("あなたが推測したのは: {}", guess);
一旦こんな感じに
fn main() {
println!("数字あてゲームを始めるよ");
println("数字を入力してね!");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("read lineの実行に失敗しました。");
}
println!("あなたが推測したのは: {}", guess);
cargo run してみましょう! $ cargo run
クレートを使ってみる # Caargo.toml [dependencies] rand = "0.8.3 かけたら cargo build しましょう
rand クレートを使って乱数を生成しよう
https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html#乱数を生成する
use std::io;
use rand::Rng; // 追加
fn main() {
println!("数字あてゲームを始めるよ");
println("数字を入力してね!");
let secret_number = rand::thread_rng(). gen_range(1..101); // 乱数の生成
println!("秘密の数字は: {}", secret_number);
...
}
cargo run で乱数を出力してみよう cargo run
数字の比較をしよう ちょっと難しいので、ここからは The Book を手元におきながら一緒にやりましょう!
数当てゲームを作ってみよう ユーザー入力比較、正解したら終了するまで ②
1. cargo で数当てゲームプロジェクト作成 2. 入力結果の保存 i. 変数 ii. 例外処理 iii. 入力結果を返してみる 3. ランダム:1~100 までの数字を作る i. rand クレートを使ってみよう ii. 出力してみよう 4. ユーザーの入力と正解を比較しよう i. match 文の使用 ii. String から int 型への変換 5. ループ:何度も回答できるようにしよう i. 正解したら終了する
入力と正解を比較しよう
match の使用
use rand::Rng;
use std::cmp::Ordering; // 追記
use std::io;
fn main() {
// ...
println!("秘密の数字は: {}", secret_number);
println!("数字を入力してね!");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("read line に失敗しました");
let guess: u32 = guess.trim().parse().expect("数字を入力してね!");
...
}
println!("あなたが推測したのは: {}", guess);
// matchで比較を行う
// cmpはResult型を返すので、それぞれの場合の結果を出力する
match guess.cmp(&secret_number) {
Ordering::Less => println!("小さすぎ!"),
Ordering::Greater => println!("大きすぎ!"),
Ordering::Equal => {
println!("あなたのかち!!");
break;
}
}
ループして何度も回答できるようにしよう
...
// 数字入力させる以降をloopに含む
loop {
println!("数字を入力してね!.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("read line に失敗しました");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("あなたが推測したのは: {}", guess);
}
match guess.cmp(&secret_number) {
Ordering::Less => println!("小さすぎ!"),
Ordering::Greater => println!("大きすぎ!"),
Ordering::Equal => {
println!("あなたのかち!!");
break;
}
}
完成!
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("数字あてゲームを始めるよ");
let secret_number = rand::thread_rng().gen_range(1..101);
loop {
println!("数字を入力してね!.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("read line に失敗しました");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("あなたが推測したのは: {}", guess);
}
}
match guess.cmp(&secret_number) {
Ordering::Less => println!("小さすぎ!"),
Ordering::Greater => println!("大きすぎ!"),
Ordering::Equal => {
println!("あなたのかち!!");
break;
}
}
参考文献 序文 - Rust プログラミング言語