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) |
メソッド一覧
Section titled “メソッド一覧”| メソッド | 状態 | 実装場所 / 備考 |
|---|---|---|
< | ✅ | 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と同義。同上。 |
compact | ✅ | hash_compact — 全値Constantのときにnilエントリを除去。 |
compact! | 🚫 | 破壊的変更。!ブロック済み。 |
compare_by_identity | 🚫 | 破壊的変更(比較方針の変更)。 |
compare_by_identity? | 🔷 | リテラルHashShapeでは常にfalse。しかしRBS boolで十分。 |
count | ✅ | hash_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]。 |
dig | ✅ | hash_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]。 |
entries | ✅ | to_aの別名。HASH_SHAPE_HANDLERSにentries: :hash_to_aを登録。 |
except | ✅ | 高優先度。 sliceの補集合。静的キーリストから子HashShapeを生成。ShapeDispatch#hash_except。 |
fetch | ✅ | hash_lookup — 静的キー。missing key時はRBS fallback。 |
fetch_values | ✅ | values_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。 |
first | ✅ | hash_first — 先頭エントリをTuple[K, V]で返す。 |
flat_map | 🚫 | Enumerable。2引数ブロック問題あり。 |
flatten | ✅ | hash_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。 |
invert | ✅ | hash_invert — 全値がConstant[Symbol/String] のとき反転HashShapeを返す。 |
keep_if | 🚫 | 破壊的変更(select!相当)。 |
key | ✅ | 値 → キー逆引き。全値Constantで一意ならConstant[k]。低優先度。 |
key? | ✅ | has_key?と同義。高優先度。ShapeDispatch#hash_has_key?に同一ハンドラ登録。 |
keys | ✅ | hash_keys — Tuple[Constant[k]…]を返す。 |
lazy | 🚫 | Enumerator::Lazy。 |
length | ✅ | hash_sizeに委譲。 |
map | 🚫 | collectと同義。2引数ブロック問題あり。 |
max | 🚫 | Enumerable。ペアの順序付け比較は複雑。 |
max_by | 🚫 | Enumerable。 |
member? | ✅ | has_key?と同義。高優先度。ShapeDispatch#hash_has_key?に同一ハンドラ登録。 |
merge | ✅ | hash_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 | 🚫 | 破壊的変更(先頭ペア削除)。 |
size | ✅ | hash_size — Constant[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_a | ✅ | hash_to_a — Tuple[Tuple[K,V],…]を返す。 |
to_h | ✅ | hash_to_h — selfを返す。 |
to_hash | ✅ | to_hの別名。HASH_SHAPE_HANDLERSにto_hと同じエントリを追加するだけ。低優先度。 |
to_proc | 🚫 | Procを返す。静的型付けには不要。 |
to_set | 🚫 | Setを返す。 |
transform_keys | ✅ | ExpressionTyper try_hash_shape_block_fold — キーを変換した新HashShape。 |
transform_keys! | ✅ | 同上(bang形式)。 |
transform_values | ✅ | ExpressionTyper try_hash_shape_block_fold — 値を変換した新HashShape。 |
transform_values! | ✅ | 同上(bang形式)。 |
uniq | 🚫 | Enumerable。 |
update | 🚫 | merge!の別名。破壊的変更。 |
value? | ✅ | has_value?の別名。低優先度。 |
values | ✅ | hash_values — Tuple[V_1,…]。 |
values_at | ✅ | hash_values_at — 静的キーリストからTuple[V…]。 |
zip | 🚫 | Enumerable。 |
対応要チェックリスト
Section titled “対応要チェックリスト”優先度別に並べています。実装したら ✅ に変更してください。
-
slice(*keys)—slice(:name, :age)→ 対応する子HashShapeを返す。exceptの逆。ShapeDispatch#hash_sliceに実装。全引数がConstant[Symbol|String]で対象キーがshapeに存在すること。欠損キーは省略(values_atと異なりnilを埋めない)。 -
except(*keys)—except(:debug)→ 対象キーを除いたHashShape。ShapeDispatch#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_keysはkeys引数に関わらずreceiver自身を返すため、精密な答えはshapeそのもの。ShapeDispatch#hash_deconstruct_keys。 -
entries—to_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。
実装に関するメモ
Section titled “実装に関するメモ”slice / except / has_key?の置き場所
Section titled “slice / except / has_key?の置き場所”ShapeDispatch::HASH_SHAPE_HANDLERSに追加し、dispatch_hash_shape経由で呼ぶ。引数はargs配列として渡ってくるので、全要素がType::Constantかつ値がSymbol | Stringかどうかを確認してから処理する。
none? / one?
Section titled “none? / one?”hash_any?/hash_empty?と同じパターン。HASH_SHAPE_HANDLERSへのエントリ追加と実装メソッド追加のみ。
fetch_valuesとassoc
Section titled “fetch_valuesとassoc”values_at(hash_values_at)と実装が非常に近い。values_atは欠損キーをConstant[nil]で埋めるが、fetch_valuesは欠損キーでdecline(RBSのraiseセマンティクスを尊重する)。
entries / to_hash
Section titled “entries / to_hash”1行のHANDLERSエントリ追加のみ。リグレッションリスクが最小。
包含比較< / <= / > / >=
Section titled “包含比較< / <= / > / >=”hash_mergeのように両引数がType::HashShapeのときのみ畳む。左辺の全ペアが右辺に含まれるかどうかを静的に判定できる。実装コストは小さいが使用頻度も低いため低優先度。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.