本記事では、Rubyにおける、
条件分岐の文法とメソッドについて解説します。
Rubyの条件分岐やメソッド定義は、
unless文や破壊的メソッドなど、
特徴的な部分も多い印象です。
そこで、本記事ではこれらについても
詳しく触れていきます。
文字ではなく、動画で視聴したいという方は、
下記の動画を御覧ください。
条件分岐
まずは、条件分岐について、
紹介します。
Rubyの場合、unless文などもあるので、
if文から順番に紹介していきます。
if文
まずは、if文です。
if文とは、毎度おなじみ、条件式がTrueのときに実行する、
いつものやつですよね。
Rubyのif文は、下記のように書きます。
print "数値を入力してください: "
num = gets.to_i
if num > 0
puts "#{num}は正の数です。"
elsif num > 100
puts "#{num}は100以上です"
else
puts "#{num} は正の数ではありません。"
end
![](https://reisuta.com/wp-content/uploads/2023/04/Screen-Shot-2023-04-27-at-8.18.58.png)
JavaScriptとかだと、条件式を( )で囲んでいたかと思いますが、
Rubyでは、そんなものは必要ないので、
記述がスッキリしていますね。
記法としては、Pythonが似ているかもしれません。
そして、特徴的なのはやはりelsifの部分でしょうか。
あまり見かけない記法なので最初は戸惑うかもしれません。
(else ifとかelifとかは見かけますが)
これは、他の言語でいう、
else ifを指しています。
最初のif文の条件式がfalseで、
else ifの条件式がtrueのときに実行したい処理を
ここに書きます。
elseとかは、他のプログラミング言語と同様ですね。
Rubyの場合かならずendが必要なので、
忘れずに記述する必要があります。
これもありそうで意外と無い気がしますね。
PythonからRubyに入ると、
記法が似ている文、このendを忘れがちです
ちなみに、elsifやelseは不要なら省略することができます。
このあたりは、特段他のプログラミング言語と変わりありませんね。
後置if
さて、そんなif文ですが、
Rubyで比較的よくつかう記法に、
後置ifというものがあります。
次のようなコードです。
print "数値を入力してください: "
num = gets.to_i
puts "#{num}は正の数です。" if num > 0
単にif文を後ろにおいただけなので、
わかりやすいと思います。
簡潔に書くのが好まれるRubyではよく使われる記法です。
ただ、elsifとかelseを交えることはできないので、
複雑な条件分岐には使えません。
unless
お次はunlessです。
Rubyの場合、
if文だけでなく、unless文というものもあります。
これはif文の真逆の機能でして、
条件が偽のときに実行されるものになります。
print "数値を入力してください: "
num = gets.to_i
puts "#{num}は負の数です。" unless num >= 0
これはすなわち、先程とは異なり、
入力値が負の数の場合に、一番下のputsの命令が実行されます。
入力値が負の場合、num >= 0の条件式が、
falseになるので、unless文が実行されるといった感じです。
unless文でも、elseを使うことができます。
この辺は、if文と同様ですね。
print "数値を入力してください: "
num = gets.to_i
unless num > 0
puts "#{num}は負の数です。"
else
puts "#{num}は正の数です。"
end
この場合、num > 0の条件式がtrueの処理が、
elseに渡されます。
unlessを使う場面としては、
value != 'valid' のように否定演算子を使った条件を、
すっきり見せるために使われたりします。
ただ、unlessやifが乱立したり、
unlessを多用すると、かえってわかりづらくなるので、
if文で書いてしまうと、かなり冗長になってしまうという場合を
のぞいて、基本unless文は使わなくてもいいかなと個人的には感じます。
「条件が偽のときに実行」って地味に、
頭の中の切り替えリソースが消費されますもんね。
case/when
お次は、caseとwhenです。
これは、JavaScriptで言う、switch構文のようなものとして、
Rubyではcase文がそれに該当します。
これは、複数の値と比較する場合に、
用いられることが多いです。
使い方としては、
print "数値を入力してください: "
num = gets.to_i
case num
when 10
puts "10です。"
when 0
puts "0です。"
when -10
puts "-10です。"
else
puts "10, 0, -10以外の数です"
end
という風に、
caseで対象のオブジェクトなどを指定し、
whenで値を指定して、その値だったときの処理を記述していく感じです。
if文で書くと、
elsifが乱立して見通しが悪くなりがちなときとかには、
case文を用いると便利なことが多いです。
三項演算子
三項演算子は、Rubyでよく使われる印象があります。
構文としては、
print "数値を入力してください: "
num = gets.to_i
value = num > 0 ? 'nは0より大きい' : '0以下'
puts value
条件式 ? 真だった場合 : 偽だった場合
という風になります。
上記の場合、num > 0という条件式がtrueなら、
value変数には、'nは0より大きい'が代入されるという流れです。
Rubyは簡潔に書くことが多いので、
簡単な条件分岐の場合、三項演算子とかで、
一行で済ませてしまうことも多いので、
覚えておくと役立つと思います。
ちなみに、三項演算子自体は、
他のプログラミング言語にもありますし、
Vue.jsとかのマスタッシュ構文とかでは、
めちゃくちゃ三項演算子が使われている印象があります。
(Vue.jsのマスタッシュ構文については、こちらの記事で言及しています。)
なので、三項演算子は、
Rubyでもガンガン使っている印象がありますが、
特段Rubyの特徴というわけでもないかなと思います。
メソッド定義
条件分岐の文法について、
紹介したので、次はメソッド周りに移ります。
これは個人的な体感ベースでしか有りませんが、
Ruby界隈では、あまり関数という呼び方をしていない印象がありまして、
大抵メソッドと呼んでいるかと思います。
なので、メソッドは、関数のことを指しています。
(関数って何って言う人は、こちらの記事で関数自体について解説しています)
Rubyでのメソッドの定義は、
次のようにします。
def add_numbers(num1, num2)
sum = num1 + num2
end
result = add_numbers(5, 7)
puts "結果は #{result} です。"
Pythonと非常に似ていますね。
JavaScriptとかでいうfunctionの記法ではないということですね。
def メソッド名
end
という形式で定義します。
ちなみに、引数がなければ、
()を省略して書くことが多いです。
メソッド名も、変数名と同じ命名ルールで、
通常小文字のスネークケースです。
そして特徴的なのが、Rubyの場合、最後に評価された式が、
戻り値となるのでわざわざreturn文を書きません。
他のプログラミング言語出身の人だと、
ついついreturnを書いてしまいますが、
返り値を返すという目的ではあまりreturnは使わず、
処理を途中で抜けたいときにreturnが使われることの方が多いです。
破壊的メソッドと非破壊的メソッド
Rubyのメソッドには、
例えば、nil?のように?がつくメソッドや、
upcase!というように!がつくメソッドなどがあります。
基本的に、?がつくメソッドは、
真偽値を返すメソッドにあたります。
Rubyのメソッドで?がついているのを見かけたら、
真偽値を判定しているものと思っていただいて大丈夫です。
これに対して、!がつくメソッドは、
より破壊的なものにあたります。(破壊的メソッド)
class String (Ruby 3.2 リファレンスマニュアル) (ruby-lang.org)
破壊的とは何かというと、
オブジェクトの内容自体を変えてしまうことを言います。
irb(main):001:0> a = 'hello'
=> "hello"
irb(main):002:0> a.upcase
=> "HELLO"
irb(main):003:0> a
=> "hello"
irb(main):004:0> a.upcase!
=> "HELLO"
irb(main):005:0> a
=> "HELLO"
upcaseが非破壊的なのに対し、
upcaseが破壊的メソッドです。
両者の違いとしては、呼び出したときに、
破壊的メソッドのupcase!は、オブジェクトの内容自体を変えてしまうので、
変数aの内容自体が大文字に変わってしまい、
単にaと入力した際、中身が大文字になっています。
ややこしいのが、!がつくのが破壊的メソッドとは限らないということです。
例えば、concatメソッドなどは、
!が付きませんが、破壊的メソッドです。
!が付いているメソッドと付いていないメソッドの両方がある際は、
!のほうが破壊的というだけです。
基本的には非破壊的メソッドのほうを使うことがいいとされていますが、
破壊的メソッドを使う場面もそれなりにあるので、
挙動を理解して使えるようになるのがいいと思います。