Slide 1

Slide 1 text

パターンマッチ 使ってるかい? 森塚 真年(@sanfrecce_osaka) 2022/05/10 Fukuoka.rb#256 #fukuokarb

Slide 2

Slide 2 text

\ ( 祝 )256 回/

Slide 3

Slide 3 text

自己紹介 森塚 真年 GitHub: @sanfrecce-osaka Twitter: @sanfrecce_osaka Qiita: @sanfrecce_osaka 株式会社エンペイ Ruby3.1/Rails6.1 We are hiring!!

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 使い所がわからない

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( 英語) のみ るりまにページをつくるべくコツコツ翻訳中 bit_clust ナニモワカラナイ 今年中には・・・ https://docs.ruby- lang.org/en/3.0/syntax/pattern_matching_rdoc.htm

Slide 17

Slide 17 text

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