full_joinというgemを作った

rubygems.org

github.com

名前が悪い

どういうgemか

こういう処理をしてくれる Array#full_join を提供する

Hoge = Struct.new(:id, keyword_init: true)

array1 = [Hoge.new(id: 1), Hoge.new(id: 2), Hoge.new(id: 3)]
array2 = [Hoge.new(id: 2), Hoge.new(id: 3), Hoge.new(id: 4)]

array1.full_join(array2)
#=> [
#  [#<struct Hoge id=1>, nil]
#  [#<struct Hoge id=2>, #<struct Hoge id=2>]
#  [#<struct Hoge id=3>, #<struct Hoge id=3>]
#  [nil, #<struct Hoge id=4>]
#]

こんな使い方もできる

Hoge = Struct.new(:id, :name, keyword_init: true)
Fuga = Struct.new(:id, :name, keyword_init: true)

array1 = [
  Hoge.new(id: 1, name: "AAA"),
  Hoge.new(id: 2, name: "BBB"),
  Hoge.new(id: 3, name: "CCC")
]
array2 = [
  Fuga.new(id: 101, name: "BBB"),
  Fuga.new(id: 102, name: "CCC"),
  Fuga.new(id: 103, name: "DDD")
]

array1.full_join(array2, &:name)
#=> [
#  [#<struct Hoge id=1, name="AAA">, nil],
#  [#<struct Hoge id=2, name="BBB">, #<struct Fuga id=101, name="BBB">],
#  [#<struct Hoge id=3, name="CCC">, #<struct Fuga id=102, name="CCC">],
#  [nil, #<struct Fuga id=103, name="DDD">]
#]

ようはFull Outer Joinみたいなまとめ方をしつつArray#zipするようなメソッドを追加してくれる

業務のコードを書くときにこれと同じ動きしてほしい*1、という場面に数回ぶつかったのでgemを作っちゃった

名前が悪い

最初は「こういうのってなんていう名前の配列操作なんだろう」と悩んで自分なりに検索したけど見つからなかった

どう形容すべきか分からなかったし、full_joinって名前もこの操作にピッタリあっているとは思えない

*1:とあるワードごとのモデルの対応表を作ることになっている