Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

【初心者向け】Rubyのブール値(true/false)を徹底解説!truthy/falsyの基本から実践テクニックまで

ブール値とは?

ブール値(boolean)とは、論理式の中で「あるものが真(true)か偽(false)か」を表すための値です。プログラムの条件分岐や判断処理に欠かせない存在です。

Rubyには Boolean という名前のクラスは存在しません。しかし、ブール値そのものはちゃんとあります。それが truefalse です。

これらはそれぞれ TrueClassFalseClass の唯一のインスタンス(シングルトンオブジェクト)として定義されています。

次のようなメソッドを呼び出すと、戻り値としてブール値が得られます。

  • empty? … 文字列や配列が空かどうか
  • all? … すべての要素が条件を満たすかどうか
  • match? … 正規表現にマッチするかどうか

また、等号演算子で比較した場合もブール値になります。

1 == 1

# => true

ただし注意したいのは、Rubyにおいて == もまた一つのメソッドであるという点です。クラスごとの実装によって挙動が変わる可能性があることを覚えておきましょう。

Truthy と Falsy の値

「truthy(トゥルーシー)」とは、if文のようなブールコンテキストの中で true とみなされる値のことです。

Rubyでは、以下の2つを除くすべての値がtruthyです。

  • false
  • nil

この2つだけが特別に「falsy(フォルシー)」と呼ばれます。他の言語では 0 や空文字列 "" が偽とみなされることがありますが、Rubyではどちらもtruthyとして扱われる点に注意してください。

実践でのブール値の扱い

たとえば、次のような条件文があったとします。

if bacon
  puts "ベーコンがあります"
end

Rubyは文字列を出力する前に、bacon がtruthy(false でも nil でもない)かどうかをチェックします。

つまり、こういうことです。

bacon に対してメソッドを呼び出さないのであれば、わざわざnilチェックを書く必要はありません。

セーフナビゲーション演算子(&.)

一方、オブジェクトに対してメソッドを呼び出したい場合もあります。

if bacon.stock
  # ...
end

しかし、baconnil の場合、このコードはエラー(NoMethodError)になってしまいます。これを回避するには、次のように書きます。

if bacon&.stock
  # ...
end

この &. は「セーフナビゲーション演算子」と呼ばれ、Ruby 2.3で導入されました。レシーバが nil の場合にはメソッドを呼び出さず、そのまま nil を返してくれます。

ブール値を返すメソッド(述語メソッド)

末尾に疑問符(?)が付いたメソッドを見たことはありませんか? 例えば empty? のようなものです。

これらは「述語メソッド(predicate methods)」と呼ばれ、慣習的に必ず truefalse を返すように設計されます。

自分でも簡単に定義できます。

def published?
  # 公開済みかどうかを判定
end

def ready?
  # 準備ができているかどうかを判定
end

これはコードをより「Rubyらしく」感じさせる優れたパターンです。積極的に取り入れましょう。

ブール値の引数は避けるべき

述語メソッドは素晴らしいのですが、逆に避けたいのが「ブール値を引数として渡す」設計です。

例:

def bacon(raw)
end

bacon(false)

bacon(false) という呼び出しを見ても、この false が何を意味しているのか全く分かりません。意図を知るにはメソッドの中身を読み込むしかありません。

さらに、ブール値の引数を受け取るメソッドは、本来必要以上に複雑になりがちです。内部で条件分岐が増え、テストケースも倍増してしまいます。

解決策は? メソッドを2つに分割するか、そもそもブール引数が不要になるような設計を見直しましょう。

ブールロジック(論理演算)

TrueClassFalseClass には、to_sinspect といった基本的なメソッドが実装されています。

しかし、より興味深いのは次の3つのメソッドです。

  • &(論理積:AND)
  • |(論理和:OR)
  • ^(排他的論理和:XOR)

これらの見慣れない記号は何なのでしょうか? これはブールロジック(論理演算)です。

真理値表はこちら。

名称 記号 TRUE / TRUE TRUE / FALSE
AND(論理積) & true false
OR(論理和) | true true
XOR(排他的論理和) ^ false true

使用例:

true & true

# => true

日常のコードで直接使う機会は多くありませんが、ブールロジックはコンピュータが動作する仕組みの根幹を成すものです。知っておいて損はないでしょう。

まとめ

Rubyのブール値について学びました!重要なポイントをおさらいします。

  • Rubyでは falsenil 以外のすべての値が「truthy」
  • nilチェックを省略できる場面と、セーフナビゲーション演算子 &. が有効な場面を見分ける
  • 述語メソッド(? 付きメソッド)でRubyらしいコードを書く
  • ブール値の引数は可読性を下げるので避ける

この記事が役に立ったら、ぜひシェアして更多人に届けてください 🙂

最後までお読みいただきありがとうございました。

  1. Rubyのdupとcloneの違いを徹底解説!オブジェクト複製の基礎知識

    Rubyではオブジェクトをコピーできることをご存じでしょうか?しかも、コピー用のメソッドは2種類用意されています。 そのメソッドとは: dup clone それぞれの違いについては後ほど詳しく見ていきますが、まず最初に… そもそもなぜオブジェクトをクローンする必要があるのでしょうか? Rubyの多くのオブジェクトはミュータブル(変更可能)です。つまり、作成した後に内容を書き換えることができます。 元のオブジェクトはそのまま保持しつつ、内容を変更したい場合には、クローン(複製)を作成するのが有効です。 具体例を挙げてみましょう。 「先頭以外のすべての要素を含む配列」が欲しい場面を想定します。

  2. Rubyのfreezeメソッド完全解説 – オブジェクトの可変性と不変性を理解しよう

    オブジェクトが「変更可能(ミュータブル)」であるとは、どういう意味なのでしょうか? 難しい言葉に構える必要はありません。「可変性(ミュータビリティ)」とは、単純に「オブジェクトの内部状態を後から変更できる」という意味です。これはすべてのオブジェクトのデフォルトの挙動であり、freeze(凍結)されたオブジェクトや、言語側で特別扱いされている一部のオブジェクトだけが例外となります。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではないのです。 なぜ数値やシンボルは変更できないのか? たとえば、整数・シンボル、さらにはtrueやfalse(これらもすべてオブジェクトです)が変化するの