Tech Hotoke Blog

IT観音とは私のことです。

スッキリ!Rubyコード改善術: おしゃれにHashを追加してみた #Ruby #Ruby on Rails #Rails

これは何?

条件によってHashにプロパティを追加したい場合に、一行一行追加する記述が冗長だったので、もう少しRubyっぽく書けないか施工錯誤したメモ。 結論はtapを使うといい感じだった。(サンプルの例がダサいコードの方がスッキリ見えてしまい申し訳ないですが...)

前提

Tips

  • tapはself を引数としてブロックを評価し、self を返します。メソッドチェインの途中で直ちに操作結果を表示するためにメソッドチェインに "入り込む" ことが、このメソッドの主目的です。 とあります。この説明だけではピンときていませんでした。
  • しかし、今回のようなケースで使うと、ブロックを渡すことができるため、条件分岐などのロジックを含めてオブジェクトを操作することができて柔軟にコードが書けるという気付きを得ました。
  • Hashオブジェクト自身にチェーンして記述するのでコードが一つの塊として読めるのも個人的にはわかりやすくていいなと感じました。Hashのプロパティ追加操作がHash本体と離れているとコードを読む時にストレスに感じるので。

Object#tap (Ruby 3.3 リファレンスマニュアル)

  • ダサいコード
  def hoge(flag)
    hash = {  fuga: false  }

  // その他の処理
  // その他の処理
  // その他の処理
  // その他の処理

   hash[:piyo] = "Piyo" if flag
   hash[:fuga] = "Fuga" if flag
   hash[:hogehoge] = "hogehoge" if flag
  end
  • おしゃれなコード
  def hoge(flag)
    {
      fuga: false
    }.tap do |hash|
      if flag
        hash[:piyo] = "Piyo"
        hash[:fuga] = "Fuga"
        hash[:hogehoge] = "hogehoge"
      end
    end
  end

備考

  • 実際のところ、どちらが良いのだろう? 好み?