LoginSignup
0
0

JavaメインからRuby学習で困惑した点(unless)

Last updated at Posted at 2022-06-20

はじめに

もともと、工業高校でC言語から始め、
社会人にてJavaで活動していたSEが転職を期に
Rubyを学んだ時の混乱について一部書きます。(条件分岐について => タイトル通りです)

お馴染みの条件分岐(if else)

Rubyを学ぶまで、if(もし)、else(でなければ)
の2つで条件分岐は丸く収まると思っていました。

unlessが登場

基本的には、言葉の文法通りに想像するなら
「もし~なら、でなければ」と基本的にはなると思います。

ところが「でなければ」から始まる構文が
Rubyでは存在しました。
これが「unless」です。

極端な例:偶数かそうでない場合の判別
(どの言語でも分かりやすいようにevenメソッドは使用しません + 括弧も付けます)

example_if_else.rb
# if、elseのパターン
if (num % 2 == 0)
  puts "偶数"
else
  puts "奇数"
end
example_unless.rb
# unlessのパターン
unless (num % 2 == 0)
  puts "奇数"
else
  puts "偶数"
end

通常、頭の中では「2で割り切れれば偶数」
「そうでなければ奇数」と自然に考えていると思います。

それが逆転するわけですから混乱します。

更に「||(または)」が混ざった場合は可読性が最低になります。
(詳しくは省きますが「ド・モルガンの法則」を利用してリファクタリングしましょう)

上記のパターンを見慣れた形にしたい、
と考え、無意識のうちにこう記述してしまうかもしれません。

example_unless_bad.rb
# unlessの二重否定パターン
unless !(num % 2 == 0)
  puts "偶数"
else
  puts "奇数"
end

これは「二重否定」と言われるもので
unlessでは避けるべきものです。

「~ではなく、ーではない」と
言葉にすると非常に違和感があると思います。

unlessで避けるべきもの(代表)

  • 二重否定
  • 「||」を混合すること

では何に使えるのか(一例)

「後置unless」という構文が存在します。
Rubyの場合には「present?(存在するか)」というメソッドがあります。
上記のメソッドは存在すると「True」、しないと「False」を返します。

例:存在しない場合にreturnしたい

example_if_present.rb
# 存在を否定(存在しない)
if !(mariori12.present?)
  return
example_unless_present.rb
# 存在しない
unless mariori12.present?
  return

どうでしょうか、こう見ると
後者の方がより直感的で分かりやすくないでしょうか。

このような場合に分かり易く
するために使うのだと思っています。(言い聞かせ)

さいごに

他にも、避けるべき例、活用できる様々な例があるとは思いますが、
この記事では代表例(恐らく)の記述のみで終わります。

もし、筆者と同じように混乱しそうな方に
役立てていただければ幸いです。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0