b-shock. Fortress

RubyのHashで、再帰的なマージ

Rubyの Hash#merge をよく使うけど、ハッシュの孫要素から先の面倒を見るものが、 モロヘイヤで必要になった。
何を言っているのか、ちょっと伝わらなそうなので。以下、実際のテストコード。

何をしたいのかは伝わると思う。

このような事例はきっとあるのでググってみたが、書かれた時代が古くて若干冗長に見えるものが多く、 結局、参考にしたものの大半を手直しした。(こーゆうのも「再発明」っていわれちゃう?)

試行錯誤の結果、たどり着いたのがこれ。

こちらも細かいところは説明しませんw。
かように、正解はシンプルなものになることが多いですね、という話。

  • 最後の dest.compact (要素の中からnilのものを削除)はお好みに合わせて。 再帰的にnilの要素を削除したかったから、今回はここに差し込む以外になかった。

  • 3項演算子が苦手で滅多に使わなかったけど、今回のような十分にスコープが小さな 時は積極的に使うとすっきりしますね。(ただ、複数行にまたがるときにあえて ifブロックではなく3項演算子を使うとよい理由は、まだ理解できないです)

  • 破壊メソッドは、今回は特に必要なかったから書きませんでした。 もし必要でも、ちょっと直すだけで書けるはず。

Hashクラスにモンキーパッチをあてるのはやめましたw
でも、 Hash#merge の動作は本来これであって欲しい。