やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

「Ruby プログラムの実行」を読む2(条件分岐 if unless)

 式と修飾子がある。

成果物

情報源

制御

条件分岐

if

if 条件式 [then]
  処理
[elsif 条件式]
  [処理]
...
[else]
  [処理]
end
  • []内は省略できる
  • elsifは複数書ける
  • 値を返す。通ったルートが最後に実行した式の戻り値を返す
if true; p 'T'; end
if true
  p 'T'
end
if true
  p 'T'
else
  p 'F'
end
if true
  p 'T'
elsif true
  p 'E'
else
  p 'F'
end
x = if true
  'T'
elsif true
  'E'
else
  'F'
end

if修飾子

p 'T' if true

 処理が1行のときif修飾子が使える。

 if式だと短縮しても以下のようにend;が必要になり冗長。

if true; p 'T'; end

 ただ、長すぎたり複雑だとわかりにくくなる。

a = b.each {|i| p i} if true 

 処理と条件がどちらもシンプルなときだけ使う。

point += 1 if clear?

 ググったところif修飾子を使った「ガード節」という書き方があるらしい。

def make_file
  # ファイルが存在したら処理中断
  return if exist?
end
def make_file
  # ファイルが存在したら例外発生
  raise AlreadyExistError if exist?
end

 Pythonでは以下のように書く。上記のガード式のほうがわかりやすい。結論が最初にあるから。

def make_file():
    if file.is_exist(): return

unless

unless 条件式 [then]
  処理
[else]
  [処理]
end
  • []内は省略できる
  • elsifは書けない
  • 値を返す。通ったルートが最後に実行した式の戻り値を返す
unless false; p 'T'; end
unless false
  p 'T'
end
unless false
  p 'T'
else
  p 'F'
end
x = unless false
  'T'
else
  'F'
end

unless修飾子

p 'T' unless false

 処理が1行のときunless修飾子が使える。

 unless式だと短縮しても以下のようにend;が必要になり冗長。

unless false; p 'T'; end

 ただ、長すぎたり複雑だとわかりにくくなる。

a = b.each {|i| p i} unless false 

 処理と条件がどちらもシンプルなときだけ使う。

point -= 1 unless fair_play?

 ググったところunless修飾子を使った「ガード節」という書き方があるらしい。

def open_file
  # ファイルが存在しないなら処理中断
  return unless exist?
end
def open_file
  # ファイルが存在しないなら例外発生
  raise NotFoundError unless exist?
end

所感

 条件分岐についてはcase-whencase-inも考慮して、その都度どちらがよいか考えて実装することになりそう。

 もしインタフェースが使えるオブジェクト指向言語だったならば多態性も考慮してデザインパターンも考慮していただろう。

 はたしてRubyはどうするのがベストなのか。まだまだその領域には到達できそうにない。

対象環境