Slide 1

Slide 1 text

パターンマッチ 使ってるかい? 森塚 真年(@sanfrecce_osaka) 2024/03/13 Kyobashi.rb#2 #kyobashirb

Slide 2

Slide 2 text

自己紹介 森塚 真年 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 を全部ドキュメント読んで設 定した

Slide 3

Slide 3 text

本編

Slide 4

Slide 4 text

パターンマッチ

Slide 5

Slide 5 text

もちろん 使ってますよね?😁

Slide 6

Slide 6 text

嘘です ( 笑 )

Slide 7

Slide 7 text

よく聞く話 構文難しい Value pattern Array pattern Find pattern Hash pattern Alternative pattern As pattern, Variable pattern 束縛, deconstruct, deconstruct_keys, ピン演算子 使い所がわからない

Slide 8

Slide 8 text

意外と カンタンデスヨ😏

Slide 9

Slide 9 text

パターンマッチを 使う際に覚えること

Slide 10

Slide 10 text

意外とこれだけ in には期待する構造のパターンを書く マッチングの方法 配列 => 要素の位置 ハッシュ => キーとバリューの組み合わせ それ以外 => #=== マッチしたものは変数に束縛( 代入) できる ユースケースを全て列挙する

Slide 11

Slide 11 text

実際の利用例

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

軽量の型のような使用感 ドキュメント オーバーロード 静的チェック 補完

Slide 16

Slide 16 text

最後に : ドキュメント 現在はrdoc( 英語) のみ るりまに PR は出した 色々あって塩漬け状態に😹 https://docs.ruby- lang.org/en/3.3/syntax/pattern_matching_rdoc.htm https://github.com/rurema/doctree/pull/2773

Slide 17

Slide 17 text

ご清聴 ありがとうございました。

Slide 18

Slide 18 text

No content