これは何?
条件によってHashにプロパティを追加したい場合に、一行一行追加する記述が冗長だったので、もう少しRubyっぽく書けないか施工錯誤したメモ。 結論はtapを使うといい感じだった。(サンプルの例がダサいコードの方がスッキリ見えてしまい申し訳ないですが...)
前提
- Ruby 3.0.2
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
備考
- 実際のところ、どちらが良いのだろう? 好み?