コンテンツにスキップ

Hash method coverage — ShapeDispatch & block-fold audit

Generated from ({}.methods - Object.new.methods).sort on Ruby 4.0 (2026-05-22). Tracks which methods produce precise HashShape results and what is still open.


記号意味
ShapeDispatch(shape_dispatch.rb)またはExpressionTyperブロックフォールドで実装済み
🔷別ティアで処理済み(BlockFolding / ConstantFolding / RBSで十分精度が出る)
🔲未実装だがHashShape精度向上の価値あり
🚫非対象(破壊的変更・Enumerator生成・精度向上がnegligible)

メソッド状態実装場所 / 備考
<HashShape同士の包含比較 → Constant[bool]にたためる。低優先度。
<=同上。
>同上。
>=同上。
[]hash_lookup — 静的キーで値型を返す。
[]=🚫破壊的変更。形状が不定になるため対象外。
all?🔷引数なし・ブロックなし → RBS bool。ブロックあり → BlockFolding。
any?hash_any? — 引数なし・ブロックなし時のみShapeDispatch。ブロックあり → BlockFolding。
assoc静的キーならTuple[Constant[k], V]またはConstant[nil]に折りたためる。
chain🚫Enumeratorを返す。HashShape精度不要。
chunk🚫Enumerable。
chunk_while🚫Enumerable。
clear🚫破壊的変更。
collect🚫Hash#mapと同義。[k,v]ペアを2引数ブロックに渡す形式は現行BlockParameterBinderが非対応。
collect_concat🚫flat_mapと同義。同上。
compacthash_compact — 全値Constantのときにnilエントリを除去。
compact!🚫破壊的変更。!ブロック済み。
compare_by_identity🚫破壊的変更(比較方針の変更)。
compare_by_identity?🔷リテラルHashShapeでは常にfalse。しかしRBS boolで十分。
counthash_size — 引数なし・ブロックなし。ブロックあり → BlockFolding COUNT_METHOD
cycle🚫Enumerable。
deconstruct_keysパターンマッチ用サブシェイプ。sliceと同構造。中優先度。
defaultリテラルHashShapeではConstant[nil]。低優先度。
default=🚫破壊的変更。
default_procリテラルHashShapeではConstant[nil]。低優先度。
default_proc=🚫破壊的変更。
delete🚫破壊的変更(形状変化)。
delete_if🚫破壊的変更。
detect🔷BlockFolding FALSEY_BLOCK_NIL_METHODSでfalseyブロック時Constant[nil]
dighash_dig — 静的キー連鎖でネスト値を取り出す。
drop🚫Enumerable。Array of [k,v]を返す。
drop_while🔷BlockFolding FILTER_KEEP_ON_FALSEY — falseyブロックでreceiver返却。
each🚫反復子。返り値はself / Enumerator。
each_cons🚫Enumerable。
each_entry🚫Enumerable。
each_key🚫反復子。
each_pair🚫eachの別名。
each_slice🚫Enumerable。
each_value🚫反復子。
each_with_index🚫Enumerable。
each_with_object🚫Enumerable。
empty?hash_empty? — 閉じた形状でConstant[bool]
entriesto_aの別名。HASH_SHAPE_HANDLERSにentries: :hash_to_aを登録。
except高優先度sliceの補集合。静的キーリストから子HashShapeを生成。ShapeDispatch#hash_except
fetchhash_lookup — 静的キー。missing key時はRBS fallback。
fetch_valuesvalues_atと類似。静的キーリストからTuple[V_1…]へ。missing keyがRBSではraiseなのでvalues_at実装の隣に置ける。中優先度。
filter🔷selectの別名。BlockFolding経由。
filter!🚫破壊的変更。
filter_map🚫Enumerable。2引数ブロック問題あり。
find🔷BlockFolding FALSEY_BLOCK_NIL_METHODS
find_all🔷selectの別名。BlockFolding経由。
find_index🔷BlockFolding FALSEY_BLOCK_NIL_METHODS
firsthash_first — 先頭エントリをTuple[K, V]で返す。
flat_map🚫Enumerable。2引数ブロック問題あり。
flattenhash_flatten[k1,v1,k2,v2,…]のTupleを返す。
grep🚫Enumerable。
grep_v🚫Enumerable。
group_by🚫Enumerable。返り値がHash[K, Array[V]]で複雑。
has_key?高優先度key?/member?/include?と同義。静的キーでConstant[true/false]ShapeDispatch#hash_has_key?
has_value?全値ConstantのときConstant[true/false]。低優先度。
include?has_key?の別名。ShapeDispatch#hash_has_key?に同一ハンドラ登録。
inject🚫Enumerable accumulator。
inverthash_invert — 全値がConstant[Symbol/String] のとき反転HashShapeを返す。
keep_if🚫破壊的変更(select!相当)。
key値 → キー逆引き。全値Constantで一意ならConstant[k]。低優先度。
key?has_key?と同義。高優先度。ShapeDispatch#hash_has_key?に同一ハンドラ登録。
keyshash_keysTuple[Constant[k]…]を返す。
lazy🚫Enumerator::Lazy。
lengthhash_sizeに委譲。
map🚫collectと同義。2引数ブロック問題あり。
max🚫Enumerable。ペアの順序付け比較は複雑。
max_by🚫Enumerable。
member?has_key?と同義。高優先度。ShapeDispatch#hash_has_key?に同一ハンドラ登録。
mergehash_merge — 両側closed HashShapeで右辺優先マージ。
merge!🚫破壊的変更。!ブロック済み。
min🚫Enumerable。
min_by🚫Enumerable。
minmax🚫Enumerable。
minmax_by🚫Enumerable。
none?高優先度。引数なし・ブロックなし → Constant[shape.pairs.empty?]hash_any?のミラー。ShapeDispatch#hash_none?
one?引数なし・ブロックなし → Constant[shape.pairs.size == 1]。中優先度。
partition🚫Enumerable。[[k,v],…] × 2を返す。
rassoc🔲値 → [k, v]逆引き。全値Constantで一意ならTuple。低優先度。
reduce🚫Enumerable accumulator。
rehash🚫破壊的変更(キーのハッシュ再計算)。
reject🔷BlockFolding FILTER_KEEP_ON_FALSEY — falseyブロックでreceiver返却。
reject!🚫破壊的変更。
replace🚫破壊的変更。
reverse_each🚫Enumerator。
select🔷BlockFolding FILTER_KEEP_ON_TRUTHY — truthyブロックでreceiver返却。
select!🚫破壊的変更。
shift🚫破壊的変更(先頭ペア削除)。
sizehash_sizeConstant[pairs.size]
slice高優先度slice(:k1, :k2) → 対応する子HashShapeを返す。ShapeDispatch#hash_slice
slice_after🚫Enumerable。
slice_before🚫Enumerable。
slice_when🚫Enumerable。
sort🚫返り値はArray[[K,V]]。複雑。
sort_by🚫Enumerable。
store🚫[]=の別名。破壊的変更。
sum🚫Enumerable。
take🚫Enumerable。Array of pairs。
take_while🔷BlockFolding FILTER_KEEP_ON_TRUTHY
tally🚫Enumerable。
to_ahash_to_aTuple[Tuple[K,V],…]を返す。
to_hhash_to_h — selfを返す。
to_hashto_hの別名。HASH_SHAPE_HANDLERSにto_hと同じエントリを追加するだけ。低優先度。
to_proc🚫Procを返す。静的型付けには不要。
to_set🚫Setを返す。
transform_keysExpressionTyper try_hash_shape_block_fold — キーを変換した新HashShape。
transform_keys!同上(bang形式)。
transform_valuesExpressionTyper try_hash_shape_block_fold — 値を変換した新HashShape。
transform_values!同上(bang形式)。
uniq🚫Enumerable。
update🚫merge!の別名。破壊的変更。
value?has_value?の別名。低優先度。
valueshash_valuesTuple[V_1,…]
values_athash_values_at — 静的キーリストからTuple[V…]
zip🚫Enumerable。

優先度別に並べています。実装したら ✅ に変更してください。

  • slice(*keys)slice(:name, :age) → 対応する子HashShapeを返す。exceptの逆。ShapeDispatch#hash_sliceに実装。全引数がConstant[Symbol|String]で対象キーがshapeに存在すること。欠損キーは省略(values_atと異なりnilを埋めない)。
  • except(*keys)except(:debug) → 対象キーを除いたHashShapeShapeDispatch#hash_except。全引数がConstant[Symbol|String]。shapeにないキーは無視。
  • has_key? / key? / member? / include? — 引数がConstant[Symbol|String]のときConstant[true/false]に畳む。ShapeDispatch#hash_has_key?に実装し、4エイリアスを同一ハンドラに登録。
  • none?(引数なし・ブロックなし) — Constant[shape.pairs.empty?]hash_any?に倣いShapeDispatch#hash_none?を追加。
  • fetch_values(*keys) — 全引数がConstant[Symbol|String]でshapeに存在するならTuple[V…]。存在しないキーがあればdecline(RBSがKeyErrorを示す)。ShapeDispatch#hash_fetch_values
  • assoc(key) — 引数がConstant[Symbol|String]で既知のキーならTuple[Constant[k], V]、未知のキーならConstant[nil]ShapeDispatch#hash_assoc
  • one?(引数なし・ブロックなし) — Constant[shape.pairs.size == 1]ShapeDispatch#hash_one?
  • deconstruct_keys(keys) — RubyのHash#deconstruct_keyskeys引数に関わらずreceiver自身を返すため、精密な答えはshapeそのもの。ShapeDispatch#hash_deconstruct_keys
  • entriesto_aと同義。HASH_SHAPE_HANDLERSにentries: :hash_to_aを登録。
  • to_hash — HASH_SHAPE_HANDLERSにto_hash: :hash_to_hを登録。
  • default(引数なし / キー引数) — リテラルHashShapeはデフォルト値なし → Constant[nil]ShapeDispatch#hash_default
  • default_proc — 同上 → Constant[nil]hash_defaultを共用。
  • has_value? / value? — 全値がConstantのときConstant[true/false]ShapeDispatch#hash_has_value?
  • key(value) — 全値がConstantのとき、最初に一致したキーのConstant[k]、存在しないときConstant[nil]ShapeDispatch#hash_key
  • <, <=, >, >= — 両辺が閉じたHashShape(全値Constant)のとき包含比較をConstant[bool]に畳む。ShapeDispatch#hash_compare

ShapeDispatch::HASH_SHAPE_HANDLERSに追加し、dispatch_hash_shape経由で呼ぶ。引数はargs配列として渡ってくるので、全要素がType::Constantかつ値がSymbol | Stringかどうかを確認してから処理する。

hash_any?/hash_empty?と同じパターン。HASH_SHAPE_HANDLERSへのエントリ追加と実装メソッド追加のみ。

values_at(hash_values_at)と実装が非常に近い。values_atは欠損キーをConstant[nil]で埋めるが、fetch_valuesは欠損キーでdecline(RBSのraiseセマンティクスを尊重する)。

1行のHANDLERSエントリ追加のみ。リグレッションリスクが最小。

hash_mergeのように両引数がType::HashShapeのときのみ畳む。左辺の全ペアが右辺に含まれるかどうかを静的に判定できる。実装コストは小さいが使用頻度も低いため低優先度。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.