ハッシュと配列でcase-whenっぽく書く

ファイルタイプの分類をとりあえず3パターン以上ならcase文しか思い浮かばず、下記のように記述していた。ただ、見た目はわかりやすいけど、冗長でなんだんかなーと思っていた。

# case-when
def replace_file_type(file_name)
  p File.ftype(file_name)
  case File.ftype(file_name)
  when 'file'
    '-'
  when 'directory'
    'd'
  when 'link'
    'l'
  end
end

rubocopを実施するとハッシュで書けと指摘があった。下のように書き直すことができた。めちゃスッキリした😄

# ハッシュで返す
def replace_file_type(file_name)
  { file: '-', directory: 'd', link: 'l' }[File.ftype(file_name).interm]
end

注意としては、上記はハッシュのシンボルになっているので、ftypeメソッドで取得したタイプをシンボル変換するために、intermメソッドにかける必要がある。

もう一個caseで冗長に書いていたところがあった。

# case-when
def replace_permission(permission)
  case permission
  when 0
    '---'
  when 1
    '--x'
  when 2
    '-w-'
  when 3
    '-wx'
  when 4
    'r--'
  when 5
    'r-x'
  when 6
    'rw-'
  when 7
    'rwx'
  end
end

ハッシュのヒントから、『0~7に意味がある(権限を示す)から、配列の要素番号と紐付けて表現しちゃえば良くね?』と考えて、下記のように修正してみた。個人的にとてもスッキリかけたと思った😄

# 配列でやってみた
def replace_permission(permission)
permission_array = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx']
end

ただ、上のコードには改善の余地があって、メンターさんに『変わらない値なら定数化してしまったほうがいいよ』確かにその通りで、定数化すれば変更されることないし、メソッドを呼び出すこともないしでいいことばかりだと思いました🧐というわけで、下記のようにしました。

# 配列でやってみた(定数化)
PERMISSION_ARRAY = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'].freeze