📘
[Feature #19840] パターンマッチの Find パターンで複数の要素を受け取れるようにする提案
[Feature #19840] [Proposal] Expand Find pattern to Multiple Find
- 次のように共通のデータ構造を持つ
Hash
の配列があるときにそのHash
の要素を一括でパターンマッチで利用できるようにする提案
# 以下のようなデータ構造のときに id や name などを一括でパターンマッチの対象として扱いした
{ results: [{ id: 1, name: "foo" }, { id: 2, name: "bar" }, ... ] }
- チケット内では具体的に以下のようなコードが提示されています
# ids で各配列内の id の要素を取得する
case { results: [{ id: 1, name: "foo" }, { id: 2, name: "bar" }] }
in results: [*{ id: ids }]
"matched: #{ids}"
else
"not matched"
end
#=> matched: [1, 2]
# * がある場合は前方で id がある要素のみ取得する
case { results: [{ id: 1, name: "foo" }, { id: 2, name: "bar" }] }
in results: [*{ id: ids }, *]
"matched: #{ids}"
else
"not matched"
end
#=> matched: [1, 2]
# * がない場合は全てに id の要素がある必要がある
# なので以下の場合はマッチしない
case { results: [{ name: "foo" }, { id: 2, name: "bar" }] }
in results: [*{ id: ids }]
"matched: #{ids}"
else
"not matched"
end
#=> not matched
-
ids = results.map { _1[:id] }
みたいな抽出を安全に行いたい場合に便利なんですかね? - 確かにこういうコードはよく書く気がするのであると便利そうな気はする
- ただ、開発者側的には同意しないとのこと
- https://bugs.ruby-lang.org/issues/19840#note-3
- パターンマッチの前身である pattern-match gen で実装したが利用頻度よりも仕様や実装の複雑さが上回るとのこと
Discussion