Upgrade to Pro — share decks privately, control downloads, hide ads and more …

パターンマッチ使ってるかい?/use-ruby-s-pattern-matching?

 パターンマッチ使ってるかい?/use-ruby-s-pattern-matching?

Masatoshi Moritsuka

May 11, 2022
Tweet

More Decks by Masatoshi Moritsuka

Other Decks in Programming

Transcript

  1. よく聞く話 構文難しい Value pattern Array pattern Find pattern Hash pattern

    Alternative pattern As pattern, Variable pattern 使い所がわからない
  2. 意外とこれだけ in には期待する構造のパターンを書く マッチングの方法 配列 => 要素の位置 ハッシュ => キーとバリューの組み合わせ

    それ以外 => #=== マッチしたものは変数に束縛( 代入) できる ユースケースを全て列挙する
  3. CASE1: ユースケースの明示 def build_errors(**context) case context in on: :no_user ['ユーザーが見つかりませんでした']

    in on: :invalid_users, users: users.flat_map { _1.errors.full_messages } end end build_errors(on: :no_user) build_errors(on: :invalid_users, users:) build_errors(on: :invalid_users) # => NoMatchingPatternError
  4. CASE2: オーバーロード def self.build(*args) case args in [ActiveSupport::TimeWithZone] args.first in

    [String] Time.zone.parse(args.first) in [Date | Time] args.first.in_time_zone in [Integer => year, Integer => month, Integer => day] Time.zone.local(year, month, day) in [] Time.zone.now end end
  5. CASE3: オプションの解析 def self.call(*args, **options) default_options.merge(options.compact) => { year:, month:,

    day: } new(*args).call(Time.zone.local(year, month, day)) end # オプショナルなキーのデフォルト値 def self.default_options { month: 1, day: 1 } end