この記事では、Rustのデータ型の中でも基本となる「真偽値(bool)」について、プログラミングが初めての方でも理解できるように、基礎からしっかり解説していきます。
Rustのプログラムを書く上で、条件によって動きを変えるのは当たり前のこと。その心臓部とも言えるのが、今回学ぶ`bool`型なんです。
この記事を読むことで、以下の点がわかるようになります。
- 真偽値(bool)って、そもそも何?
- Rustで`bool`型の変数をどうやって作るの?
- プログラムの「もしも」を実現する`if`文での使い方
- `true`や`false`を生み出す比較演算子や論理演算子って?
- `bool`型を使うときに気をつけたいこと
「なんか難しそう…」なんて思わなくて大丈夫!サンプルコードを動かしながら、一歩ずつ進んでいきましょう。
読み終わるころには、「なるほど、`bool`型ってそういうことか!」と自信がついているはず。
Rustのデータ型「真偽値(bool)」とは?
プログラミングを始めると、色々なデータ型に出会いますよね。
数字だったり、文字だったり。その中でも、とびきりシンプルなのに、めちゃくちゃ活躍するのが「真偽値(しんぎち)」です。
真偽値というのは、簡単に言うと「正しいか、正しくないか」の二択を表すデータのこと。現実世界で「Yes/No」とか「オン/オフ」で答える状況を、プログラムの中で表現する方法と考えてみてください。
Rust言語では、この真偽値を表すデータ型を `bool` と呼びます。そして、`bool`型が持つことができる値は、世界にたった二つだけ。
true
(トゥルーと読みます) 「真」や「正しい」という意味。false
(フォールスと読みます) 「偽」や「正しくない」という意味。
たった二つの値しかないシンプルな型ですが、プログラムが「もし〇〇だったら××する、そうでなければ△△する」といった判断をする際に、なくてはならない存在なんです。
例えば、「ユーザーがログインしていたら(true)マイページを表示する、していなければ(false)ログイン画面を表示する」みたいな処理は、まさに`bool`型の出番ですね。
Rustにおける真偽値(bool)の基本的な書き方
では、実際にRustのコードの中で、どうやって`bool`型のデータを使うのか見ていきましょう。
変数に`bool`型の値(`true`か`false`)を入れるには、他のデータ型と同じように`let`を使います。
変数の宣言と明示的な型注釈
変数を作るときに、「この変数には`bool`型のデータが入りますよ!」と、はっきり種類を指定する方法があります。これを「型注釈(かたちゅうしゃく)」と呼びます。
書き方は、変数名の後にコロン(`:`)と型名(`bool`)を続けるだけ。
`true` を変数に入れる例
fn main() { let is_rust_fun: bool = true; // is_rust_fun という名前の変数に bool 型の true を入れる println!("Rustは楽しい? {}", is_rust_fun); }
`false` を変数に入れる例
fn main() { let is_morning: bool = false; // is_morning という名前の変数に bool 型の false を入れる println!("今は朝? {}", is_morning); }
このように `let 変数名: bool = 値;` の形で書くのが、`bool`型変数を作る基本です。
型をはっきり書くことで、コードを読む人が「あ、この変数は`true`か`false`が入るんだな」と分かりやすくなるメリットがあります。
型推論による省略記法
Rustには「型推論(かたすいろん)」という便利な機能があります。
これは、変数に入れる最初の値から、「ふむふむ、これは`bool`型だな」とRustコンパイラ(プログラムをコンピュータがわかる言葉に翻訳するやつ)が自動で型を判断してくれる機能です。
なので、最初の値が明らかに`true`か`false`なら、わざわざ `: bool` と書かなくてもOKなんです。
fn main() { let is_learning = true; // true を入れたので、コンパイラが「これは bool 型だ」と推論してくれる let needs_break = false; // false を入れたので、これも bool 型だと推論される println!("学習中? {}", is_learning); println!("休憩が必要? {}", needs_break); }
ね、`: bool` がなくても動くでしょ?
ただ、コードの分かりやすさを考えると、特に最初のうちは `: bool` を書いて型を明示する方が、自分にとっても他の人にとっても親切かもしれませんね。
Rustでの真偽値(bool)の具体的な使い方
さて、`bool`型の基本的な作り方がわかったところで、いよいよ実践編です!
`bool`型が一番輝く場面、それはズバリ「条件分岐」です。プログラムの流れをコントロールする上で欠かせない仕組みを見ていきましょう。
条件分岐(if文)での活用
「もし〇〇が`true`だったらコレをする、そうでなければアレをする」を実現するのが`if`文です。
`if`の後ろの条件式(〇〇の部分)に、`bool`型の値や、結果が`bool`型になる式を書きます。
基本的なif文
fn main() { let is_sunny: bool = true; if is_sunny { // is_sunny が true かどうかをチェック println!("傘は持っていかなくていいね!"); // true だったら、ここが実行される } else { println!("念のため傘を持っていこう。"); // false だったら、ここが実行される } }
このコードを実行すると、`is_sunny`は`true`なので「傘は持っていかなくていいね!」と表示されます。
もし`let is_sunny: bool = false;` に変えて実行すれば、「念のため傘を持っていこう。」と表示されるわけです。
複数の条件を扱う if-else if-else
もっと複雑な条件分岐も可能です。
fn main() { let temperature = 25; if temperature > 30 { // もし気温が30度より高いなら println!("めっちゃ暑い!エアコンつけよう。"); } else if temperature > 20 { // そうでなくて、もし気温が20度より高いなら (30度以下) println!("過ごしやすい気温だね。"); } else { // どちらでもないなら (20度以下) println!("ちょっと肌寒いかも?上着いるかな。"); } }
この例では、`temperature`の値によって表示されるメッセージが変わります。`if` や `else if` の条件が `true` になった時点で、その中の処理が実行され、残りの条件はチェックされません。これが`if`文の動きの基本です。
比較演算子と真偽値
`if`文の条件式では、「〇〇は××と等しい?」とか「△△は□□より大きい?」といった比較をよく行います。この比較の結果は、必ず`true`か`false`の`bool`値になります。
比較を行うための記号を「比較演算子(ひかくえんざんし)」と呼びます。Rustで使える主な比較演算子を見てみましょう。
==
: 等しい (数学の = と同じ意味)!=
: 等しくない<
: より小さい>
: より大きい<=
: 以下>=
: 以上
注意点として、代入に使う `=` と、比較に使う `==` は全く別物です! ここはよく間違えるポイントなので、しっかり区別してくださいね。
fn main() { let score = 75; let pass_score = 60; let is_pass = score >= pass_score; // score が pass_score 以上か? (true になる) println!("合格? {}", is_pass); // true と表示される if score == 100 { // もし score が 100 と等しいなら println!("満点だ!すごい!"); } else if score >= pass_score { // そうでなくて、もし score が pass_score 以上なら println!("合格おめでとう!"); } else { // どちらでもないなら (pass_score 未満) println!("残念、また頑張ろう!"); } }
この例では、`score >= pass_score` という比較の結果(`bool`値)を変数 `is_pass` に入れています。そして`if`文の中でも比較演算子 `==` や `>=` を使って条件を判断していますね。
論理演算子と真偽値
時には、複数の条件を組み合わせて判断したい場面があります。「Aが`true` で、かつ Bも`true`だったら」とか、「Aが`true` または Bが`true`だったら」のような場合です。
こうした複数の`bool`値を組み合わせるために使うのが「論理演算子(ろんりえんざんし)」です。
&&
: AND (かつ) 両方の条件が`true`のときだけ、全体が`true`になる。||
: OR (または) どちらか一方でも`true`なら、全体が`true`になる。!
: NOT (ではない) `true`を`false`に、`false`を`true`にひっくり返す。
fn main() { let hour = 10; let is_weekend = false; // 条件1: 平日 (is_weekend が false) かつ 時間が 9時以降 18時未満 か? if !is_weekend && hour >= 9 && hour < 18 { println!("勤務時間中です。頑張りましょう!"); } else { println!("勤務時間外、または週末です。リラックス!"); } // 条件2: 週末 (is_weekend が true) または 時間が 18時以降 か? if is_weekend || hour >= 18 { println!("自由時間だ!"); } }
この例では、`!` で `is_weekend` の真偽を反転させたり、`&&` で複数の条件を組み合わせたり、`||` でどちらかの条件が満たされればOK、という判断をしています。
論理演算子を使うことで、より現実に近い複雑な条件をプログラムで表現できるようになります。
Rustの真偽値(bool)を扱う上での注意点
とっても便利な`bool`型ですが、Rustならではのルールがいくつかあります。安全にプログラムを書くために、以下の点を知っておきましょう。
型の安全性:`bool`は数値などと混ぜられない
他のプログラミング言語、例えばC言語などでは、数値の0を`false`、0以外の数値を`true`として扱うことができたりします。
しかし、Rustでは`bool`型は`bool`型、数値型は数値型とはっきり区別されます。
`bool`型の変数に数値を入れようとしたり、数値型の変数に`true`や`false`を入れようとしたりすると、コンパイルエラーになります。
// これはエラーになる例! fn main() { // let flag: bool = 1; // エラー! bool型に数値は入れられない // let number: i32 = true; // エラー! i32型にbool値は入れられない }
一見、不便に感じるかもしれませんが、これはRustがプログラムの間違いを早い段階(コンパイル時)で見つけやすくするための設計思想なんです。
「型が違うものをうっかり混ぜてしまう」というミスを防いでくれる、と考えましょう。
`if`文の条件式は必ず`bool`型
これもRustの重要なルールです。
`if`文の後ろに書く条件式は、必ず評価結果が`bool`型(`true`か`false`)になるものでなければなりません。数値を直接書いたりすることはできません。
fn main() { let number = 5; // 正しい例 if number > 0 { // number > 0 は bool 値 (true) を返す println!("numberは正の数です"); } // 間違った例 (コンパイルエラーになる!) // if number { // エラー! number は i32 型であり、bool 型ではない // println!("これは動きません"); // } }
もし`if number { ... }` のような書き方をすると、コンパイラが「`if`の条件は`bool`じゃないとダメだよ!`i32`型が来てるよ!」と、ちゃんとエラーメッセージで教えてくれます。
これもプログラムの安全性を高めるための仕組みです。
【まとめ】Rustの真偽値(bool)をマスターしよう
お疲れ様でした!今回はRustの基本的なデータ型の一つ、「真偽値(`bool`)」について掘り下げてきました。
ポイントを振り返ってみましょう。
- 真偽値は`true`か`false`の二つの値を持つ`bool`型。
- 変数は `let 変数名: bool = 値;` または型推論で `let 変数名 = 値;` と書ける。
- `bool`型は主に`if`文などの条件分岐で大活躍する。
- 比較演算子(`==`, `!=`, `>` など)は`bool`値を返す。
- 論理演算子(`&&`, `||`, `!`)で複雑な条件を作れる。
- Rustでは`bool`型と他の型(数値など)は厳密に区別される。
- `if`文の条件式には必ず`bool`型を指定する必要がある。
`bool`型はシンプルですが、プログラムが状況に応じて賢く動くためには絶対に欠かせない要素です。今回の内容をしっかり理解しておけば、これから学ぶループ処理や関数の定義など、他のRustの機能もスムーズに学習を進められるはず。
ぜひ、この記事のサンプルコードを自分で打ち込んで動かしてみて、`bool`型の動きを体感してくださいね。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。