オンライン飲み会、Enumerable#group_by

社のオンライン飲み会

  • もといご飯を食べながらだべる会
  • Rust がアツいよねーとかエンジニアチームとビジネスサイドのお困りごととか
  • 自分のスキルセットの戦略どうするみたいな
    • 学んだことをどうアウトプットできるか?
    • むしろ戦略立てなくて好きにするとか

hash の value が一致しているか知りたい

hash1 = {a: 1, b: 1, c: 1, d: 1, e: 1}
hash2 = {a: 1, b: 1, c: 2, d: 1, e: 1}
hash3 = {a: 1, b: 1, c: 2, d: 3, e: 1}

こんな感じの hash がいくつかあるとき、各 hash の value が一致しているかを知りたい。一致していない場合は何が不一致だったのか知りたい。 もうちょっと具体的にはこんな hash で、ある gem 名をキーにして、複数の gemfile.lock の同じ gem のバージョンを比較したい。

{:ransack, {:gemfile1, Gem::Version.new('1.0.0'), :gemfile2, Gem::Version.new('1.0.0')}}

どうしたもんかなーと思って素朴に実装してみた。

hash = {a: 1, b: 1, c: 2, d: 1, e: 1}
hash.inject { if _1[1] != _2[1] ; p _1, _2; end; _1}
# [:a, 1]
# [:c, 2]
# => [:a, 1]

なんかもっと綺麗に書けないかしら、と思ってフィヨルドブートキャンプの自分の分報につぶやいたら、アドバイスを貰って

hash = {a: 1, b: 1, c: 2, d: 1, e: 1}
hash.group_by(&:last)
# => {1=>[[:a, 1], [:b, 1], [:d, 1], [:e, 1]], 2=>[[:c, 2]]}

こう書けることを教えてもらった。