---
title: RustでHello world!と簡単なゲームを作ってみよう！
tags: 
author: [ふみふみ](https://www.docswell.com/user/2323code)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PEXP4KQ87X.jpg?width=480
description: 2024/08/25に開催された「RustLadies #1 Rustを触ってみよう！ 」のハンズオンで使用した資料です！  https://rustladies.connpass.com/event/326725/
published: August 27, 24
canonical: https://www.docswell.com/s/2323code/5QR86X-2024-08-27-223244
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PEXP4KQ87X.jpg)

Rust を触ってみよう！
2024/08/24 RustLadies#1 ハンズオン
ふみふみ
x: @2323_code
GitHub: 2323-code


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3EKDZ59LJD.jpg)

今日のゴール
Rust、自分にもかけるかも！ と思ってもらうこと


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L73RDKW6J5.jpg)

対象者
Rust 書いたことがない方
他の言語で開発経験がある方


# Page. 4

![Page Image](https://bcdn.docswell.com/page/87DYP3KM7G.jpg)

ちなみに、
Rust 今日初めて書くよ〜って方は...？


# Page. 5

![Page Image](https://bcdn.docswell.com/page/VJP6N4KQE8.jpg)

ありがとうございます！


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2EV3KXVP7Q.jpg)

アジェンダ
1. Rust とは
2. Hello World!
3. Cargo を使ってみよう
4. 休憩
5. 数あてゲームを作ってみよう１
6. 休憩
7. 数あてゲームを作ってみよう２
8. しめ


# Page. 7

![Page Image](https://bcdn.docswell.com/page/57G3QVLQJL.jpg)

会場案内
お菓子、飲み物気軽につまみながらで
OK！
エアコン寒いなどあれば、気軽におっしゃってください！
お手洗いは後ろの、左曲がって突き当たりです！
一緒に楽しくコーディングしていきましょう！


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4EQ5K6YWJP.jpg)

Rust とは


# Page. 9

![Page Image](https://bcdn.docswell.com/page/KJ49P4W171.jpg)

誰もが効率的で、信頼できるソフトウェアを作れる言語
https://www.rust-lang.org/ja
高パフォーマンス
メモリ効率
他の言語との統合
信頼性
型が豊富
所有権によるメモリの安全性
コンパイル時にバグが削減される
生産性
ローカルから見られるドキュメント
解決策も提示してくれるコンパイラ


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE1K94Y5JG.jpg)

Rust で作れるもの
CLI ツール
Java Script と組み合わせた Web アプリケーション
Wasm
Web バックエンド


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GEWDQXGWJ2.jpg)

...？
書いたほうが早いと思います。
まずは
Hello World してみましょう！


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47ZGW6L2E3.jpg)

Rust インストールはお済みですか？
もしできていない方いたら教えてください！
https://doc.rust-lang.org/book/ch01-01-installation.html
https://www.rust-lang.org/tools/install
に行けば OS に沿ったやり方を提示してくれます
Linux or Mac:
$ curl --proto &#039;=https&#039; --tlsv1.2 https://sh.rustup.rs -sSf | sh
Rust が正しくインストールされているかどうかを確認するには、シェルを開いて
次の行を入力します。
$ rustc --version


# Page. 13

![Page Image](https://bcdn.docswell.com/page/YJ6YG2M67V.jpg)

Hello, World！
Rust のファイルの拡張子は .rs です！
Hello World 用のファイル main.rs を作りましょう。
mkdir rustladies
cd rustladies
touch main.rs


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJ5GV2Z5J4.jpg)

main() を定義しよう
// main.rs
fn main() {
println!(&quot;Hello, World!&quot;);
}


# Page. 15

![Page Image](https://bcdn.docswell.com/page/9E2Y34RGER.jpg)

ファイルを保存して、コンパイルしよう
$ rustc main.rs // windowsでは .\main.exe
$ ./main
Hello World!


# Page. 16

![Page Image](https://bcdn.docswell.com/page/D7YG1MDG7M.jpg)

\ ようこそ、新たな Rustacean の皆様〜！！！！ /
Rust を書く人は Rustacean と呼ばれます。
おめでとうございます！！！


# Page. 17

![Page Image](https://bcdn.docswell.com/page/VENG2W68J8.jpg)

コードの解説
main()
実行可能な
Rust のプログラムで、最初に実行されるコード
println!
出力するためのマクロ
今回は引数に &quot;Hello World!&quot; を渡す
セミコロン ; で終了する
// main.rs
fn main() {
println!(&quot;Hello, World!&quot;);
}


# Page. 18

![Page Image](https://bcdn.docswell.com/page/Y79W1XLX73.jpg)

コマンドの解説
rustc
コンパイル
成功するとバイナリ実行可能なファイルを出力
ls -la すると見えます！
$ rustc main.rs // windowsでは .\main.exe
$ ./main
Hello World!


# Page. 19

![Page Image](https://bcdn.docswell.com/page/G78N42X9JD.jpg)

とはいえ、毎回コンパイルコマンド
↓
バイナリファイルを実行、はちょっと面倒
...


# Page. 20

![Page Image](https://bcdn.docswell.com/page/L7LP628MJR.jpg)

Cargo を使ってみよう


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4EM45866JW.jpg)

Cargo とは
Rust のビルドシステム &amp; パッケージマネージャー
すごいよ
Cargo さん
コードのビルド、実行
ライブラリのダウンロード、ビルド
プロジェクト作成


# Page. 22

![Page Image](https://bcdn.docswell.com/page/PERW35PNJ9.jpg)

Cargo でプロジェクトを作ってみよう
一度 rustladies ディレクトリに戻って、
$ cd ../
$ cargo new hello_cargo
$ cd hello_cargo
cargo プロジェクトを作ってみましょう！


# Page. 23

![Page Image](https://bcdn.docswell.com/page/P7XP4K38JX.jpg)

hello_cargo の中身を見てみよう
src
ソースファイル
Cargo.toml
パッケージの内容を示すファイル
依存関係は dependencies に記載します。


# Page. 24

![Page Image](https://bcdn.docswell.com/page/37KDZ5YLED.jpg)

補足：クレート
Rust では、コードのパッケージを crates（クレート）と呼びます。
Python: ライブラリ
Java: パッケージ
Ruby: gem


# Page. 25

![Page Image](https://bcdn.docswell.com/page/LJ3RDK96E5.jpg)

Cargo でビルドしてみよう
$ cargo build
$ ./target/debug/hello_cargo
Hello, World!
実行ファイルが ./target ディレクトリに配置されます。


# Page. 26

![Page Image](https://bcdn.docswell.com/page/8JDYP3GMJG.jpg)

ビルドと実行を一気に実行しよう
$ cargo run
実行ファイルの場所などを気にしなくて
OK！便利！


# Page. 27

![Page Image](https://bcdn.docswell.com/page/VEP6N43Q78.jpg)

コンパイルできるか不安になったら
$ cargo check
実行ファイルを使わずに、コンパイルできるか確認できます。


# Page. 28

![Page Image](https://bcdn.docswell.com/page/27V3KX4PJQ.jpg)

Hello, World &amp; Cargo まとめ
Rust のファイルは .rs で作成できる。
基本はコンパイル → 出力された実行ファイルを実行、という流れ。
cargo を使うとコードのビルド、実行、プロジェクトの作成などができる。


# Page. 29

![Page Image](https://bcdn.docswell.com/page/5JG3QV1QEL.jpg)

数当てゲームを作ってみよう
入力〜入力結果を返すまで
①


# Page. 30

![Page Image](https://bcdn.docswell.com/page/47Q5K6DWEP.jpg)

数当てゲーム？
1 100 までの数字のうち 1 つ選ばれる
ランダムで 〜
数字を回答
正解より多いか少ないか出力される
正解を当てたら終了


# Page. 31

![Page Image](https://bcdn.docswell.com/page/KE49P4Z1J1.jpg)

開発の流れ
1. cargo で数当てゲームプロジェクト作成
2. 入力された数を保存する
i. 変数
ii. 例外処理
iii. 入力結果を返してみる
3. ランダム：1~100 までの数字を作る
i. rand クレートを使ってみよう
ii. 出力してみよう
4. ユーザーの入力と正解を比較しよう
i. match 文の使用
ii. String から int 型への変換
5. ループ：何度も回答できるようにしよう
i. 正解したら終了する


# Page. 32

![Page Image](https://bcdn.docswell.com/page/L71K94R5EG.jpg)

cargo で数当てゲームプロジェクト作成
https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html#processing-aguess
cd ../
cargo new guessing_game


# Page. 33

![Page Image](https://bcdn.docswell.com/page/G7WDQX1WE2.jpg)

入力された数を保存する
let で変数を作れる
デフォルトは不変。
mut を作ると、値を変更できる変数にできる
String::new()
空の文字列
use std::io; // 入出力ライブラリ
fn main() {
println!(&quot;数字あてゲームを始めるよ&quot;);
println(&quot;数字を入力してね！&quot;);
...
let mut guess = String::new();
// 変数の作成、入力の保存


# Page. 34

![Page Image](https://bcdn.docswell.com/page/4JZGW6P273.jpg)

例外処理
&amp;
参照
とりあえずデフォルトで不変、でも mut で変えられるようにしているんだ
な、で
OK
.expect()
エラーがあった場合に返す内容
...
...
}
io::stdin() //入力の取得
.read_line(&amp;mut guess) //OKなら入力値を返す
.expect(&quot;read lineの実行に失敗しました。&quot;);


# Page. 35

![Page Image](https://bcdn.docswell.com/page/YE6YG246JV.jpg)

変数を出力する
&quot; {} &quot; のように書く
{} の中に、変数の値を出力できる
...
println!(&quot;あなたが推測したのは: {}&quot;, guess);


# Page. 36

![Page Image](https://bcdn.docswell.com/page/GE5GV2Q5E4.jpg)

一旦こんな感じに
fn main() {
println!(&quot;数字あてゲームを始めるよ&quot;);
println(&quot;数字を入力してね！&quot;);
let mut guess = String::new();
io::stdin()
.read_line(&amp;mut guess)
.expect(&quot;read lineの実行に失敗しました。&quot;);
}
println!(&quot;あなたが推測したのは: {}&quot;, guess);


# Page. 37

![Page Image](https://bcdn.docswell.com/page/972Y34PG7R.jpg)

cargo run してみましょう！
$ cargo run


# Page. 38

![Page Image](https://bcdn.docswell.com/page/DJYG1M5GJM.jpg)

クレートを使ってみる
# Caargo.toml
[dependencies]
rand = &quot;0.8.3
かけたら cargo build しましょう


# Page. 39

![Page Image](https://bcdn.docswell.com/page/V7NG2WN8E8.jpg)

rand クレートを使って乱数を生成しよう
https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html#乱数を生成する
use std::io;
use rand::Rng; // 追加
fn main() {
println!(&quot;数字あてゲームを始めるよ&quot;);
println(&quot;数字を入力してね！&quot;);
let secret_number = rand::thread_rng(). gen_range(1..101); // 乱数の生成
println!(&quot;秘密の数字は: {}&quot;, secret_number);
...
}


# Page. 40

![Page Image](https://bcdn.docswell.com/page/YJ9W1XRXJ3.jpg)

cargo run で乱数を出力してみよう
cargo run


# Page. 41

![Page Image](https://bcdn.docswell.com/page/GJ8N42W9ED.jpg)

数字の比較をしよう
ちょっと難しいので、ここからは
The Book を手元におきながら一緒にやりましょう！


# Page. 42

![Page Image](https://bcdn.docswell.com/page/LJLP62NMER.jpg)

数当てゲームを作ってみよう
ユーザー入力比較、正解したら終了するまで
②


# Page. 43

![Page Image](https://bcdn.docswell.com/page/47M458X6EW.jpg)

1. cargo で数当てゲームプロジェクト作成
2. 入力結果の保存
i. 変数
ii. 例外処理
iii. 入力結果を返してみる
3. ランダム：1~100 までの数字を作る
i. rand クレートを使ってみよう
ii. 出力してみよう
4. ユーザーの入力と正解を比較しよう
i. match 文の使用
ii. String から int 型への変換
5. ループ：何度も回答できるようにしよう
i. 正解したら終了する


# Page. 44

![Page Image](https://bcdn.docswell.com/page/P7RW35NNE9.jpg)

入力と正解を比較しよう
match の使用
use rand::Rng;
use std::cmp::Ordering; // 追記
use std::io;
fn main() {
// ...
println!(&quot;秘密の数字は: {}&quot;, secret_number);
println!(&quot;数字を入力してね！&quot;);
let mut guess = String::new();
io::stdin()
.read_line(&amp;mut guess)
.expect(&quot;read line に失敗しました&quot;);
let guess: u32 = guess.trim().parse().expect(&quot;数字を入力してね!&quot;);


# Page. 45

![Page Image](https://bcdn.docswell.com/page/PJXP4KN8EX.jpg)

...
}
println!(&quot;あなたが推測したのは: {}&quot;, guess);
// matchで比較を行う
// cmpはResult型を返すので、それぞれの場合の結果を出力する
match guess.cmp(&amp;secret_number) {
Ordering::Less =&gt; println!(&quot;小さすぎ!&quot;),
Ordering::Greater =&gt; println!(&quot;大きすぎ！&quot;),
Ordering::Equal =&gt; {
println!(&quot;あなたのかち！!&quot;);
break;
}
}


# Page. 46

![Page Image](https://bcdn.docswell.com/page/3JKDZ5NL7D.jpg)

ループして何度も回答できるようにしよう
...
// 数字入力させる以降をloopに含む
loop {
println!(&quot;数字を入力してね！.&quot;);
let mut guess = String::new();
io::stdin()
.read_line(&amp;mut guess)
.expect(&quot;read line に失敗しました&quot;);
let guess: u32 = match guess.trim().parse() {
Ok(num) =&gt; num,
Err(_) =&gt; continue,
};
println!(&quot;あなたが推測したのは: {}&quot;, guess);
}
match guess.cmp(&amp;secret_number) {
Ordering::Less =&gt; println!(&quot;小さすぎ!&quot;),
Ordering::Greater =&gt; println!(&quot;大きすぎ！&quot;),
Ordering::Equal =&gt; {
println!(&quot;あなたのかち！!&quot;);
break;
}
}


# Page. 47

![Page Image](https://bcdn.docswell.com/page/LE3RDKV675.jpg)

完成！
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!(&quot;数字あてゲームを始めるよ&quot;);
let secret_number = rand::thread_rng().gen_range(1..101);
loop {
println!(&quot;数字を入力してね！.&quot;);
let mut guess = String::new();
io::stdin()
.read_line(&amp;mut guess)
.expect(&quot;read line に失敗しました&quot;);
let guess: u32 = match guess.trim().parse() {
Ok(num) =&gt; num,
Err(_) =&gt; continue,
};
println!(&quot;あなたが推測したのは: {}&quot;, guess);
}
}
match guess.cmp(&amp;secret_number) {
Ordering::Less =&gt; println!(&quot;小さすぎ!&quot;),
Ordering::Greater =&gt; println!(&quot;大きすぎ！&quot;),
Ordering::Equal =&gt; {
println!(&quot;あなたのかち！!&quot;);
break;
}
}


# Page. 48

![Page Image](https://bcdn.docswell.com/page/8EDYP38MEG.jpg)

参考文献
序文
- Rust プログラミング言語


