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

パターンマッチ使ってるかい?(kyobashi.rb)/use-ruby-s-pattern-...

 パターンマッチ使ってるかい?(kyobashi.rb)/use-ruby-s-pattern-matching-on-kyobashi-rb

Masatoshi Moritsuka

March 13, 2024
Tweet

More Decks by Masatoshi Moritsuka

Other Decks in Programming

Transcript

  1. 自己紹介 森塚 真年 GitHub: @sanfrecce-osaka Twitter(X) ・Qiita: @sanfrecce_osaka 趣味: コミュニティ・勉強会

    Machida.rb ・Hirakata.rb 株式会社エンペイ Ruby3.2/Rails7.0 Node.js v18/Vue.js 3.3/Vuetify 3.4 最近 Layout Cop を全部ドキュメント読んで設 定した
  2. よく聞く話 構文難しい Value pattern Array pattern Find pattern Hash pattern

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

    それ以外 => #=== マッチしたものは変数に束縛( 代入) できる ユースケースを全て列挙する
  4. 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
  5. 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
  6. 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
  7. 最後に : ドキュメント 現在はrdoc( 英語) のみ るりまに PR は出した 色々あって塩漬け状態に😹

    https://docs.ruby- lang.org/en/3.3/syntax/pattern_matching_rdoc.htm https://github.com/rurema/doctree/pull/2773