Rubyと仲良くなりたい٩( 'ω' )و

Rubyと仲良くなりたい日々のこと

if文の条件はただの条件であって何もしないという誤解

if文について

普通は、このように条件によって処理を分岐する記述をします。

age = 20

if age < 18 then
  print "未成年"
elsif age < 20 then
  print "今は未成年だけど2020年4月からは成年"
else 
  print "成年"
end

この条件という言葉に引っ張られて、if文のことを盛大に勘違いしていたのです…。

if文について詳しく

制御構造 - Ruby 2.5.0 リファレンスマニュアル によると、if文とは、こういったもの。

条件式を評価した結果が真である時、then 以下の式を評価します。 if の条件式が偽であれば elsif の条件を評価します。 elsif 節は複数指定でき、全ての if および elsif の条件式が偽であったとき else 節があればその式が評価されます。

では、真偽とは?

偽: falseとnil 真: falseとnilを除くすべての値

何を勘違いしていたか

if hogehogehogehogeの部分はただの「条件」であって何もしないと誤解していました。 つまり、条件式を処理して、その処理結果は条件分岐以外に何も影響を与えないと。

例えば、このような式の場合であれば、出力結果は、20となります。

age = 20
if age + 5
  print age
else
  print "age+5が偽"
end

こういうのを見慣れていて、出力結果が条件分岐以外に影響しないというイメージがついていたのかもしれません。
これは、単純にage+5が処理されていて、処理結果が真だっただけのことで、ageに対しては何も変更が加えられていなかっただけでした。

上の式のage + 5age += 5に変更してみます。

age = 20
if age += 5
  print age
else
  print "age+5が偽"
end

条件がただの条件であって実際には処理されないと考えると、出力されるのは20(間違い)となります。 しかし、実際にはage += 5が処理され、falseでもnilでもない値25が評価されているため、出力されるのは25です。

ageの値も25となっています。

print age

最後に

条件はただの条件であって何もしない、という勘違い。 Rubyに限った話ではないけれども、今まで条件としてしか扱わなかったら全然気がつかなかった盛大な勘違いの話でした。