Omotesando.rb #56 で LT してきた

約9ヶ月ぶりぐらいに Omotesando.rb が開催されて LT してきました。
今回ははじめてのオンライン開催です!

パターンマッチと右代入が便利になる gem をつくった

内容は前に pattern_matchable というパターンマッチで便利に使える gem をつくったのでその話をしてきました。
この gem を使うと以下のようにメソッド呼び出しに対してパターンマッチができます。

require "pattern_matchable"

# Time クラスのみ拡張する
using PatternMatchable Time

class Time
  def to_four_seasons
    # month メソッドで判定する
    case self
    in { month: (3..5) }  then "spring"
    in { month: (6..8) }  then "summer"
    in { month: (9..11) } then "autumn"
    in { month: (1..2) } | { month: 12 } then "winter"
    end
  end
end

p Time.now.to_four_seasons  # => "autumn"

# 右代入でメソッドの結果を変数に代入できる
Time.now => { hour:, min:, sec: }
p hour   # => 3
p min    # => 35
p sec    # => 45


# Array は拡張されない
# error: ["homu", "mami", "mado"] (NoMatchingPatternError)
case ["homu", "mami", "mado"]
in { first:, last:, size: }
end

これ、かなり便利だと思うんですよねえ。
パターンマッチは使うまでよくわからないと思うんですが実際使ってみるとかなり強力なので数年後は当たり前に使われている機能になっていると予想しています。