📘

[Feature #19840] パターンマッチの Find パターンで複数の要素を受け取れるようにする提案

2024/08/13に公開

[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] } みたいな抽出を安全に行いたい場合に便利なんですかね?
  • 確かにこういうコードはよく書く気がするのであると便利そうな気はする
  • ただ、開発者側的には同意しないとのこと
GitHubで編集を提案

Discussion