コンテンツにスキップ

rigor-mangrove

MangroveResultOptionのunwrap系の戻り値の型を、untypedから呼び出し箇所で運ばれている具体的な型引数へと先鋭化し、さらにEnumvariants do … endDSLがランタイムで生成するサブクラスを合成して、それらが静的に解決されるようにします。rigor-sorbet(Mangroveのsig/RBIサーフェスを取り込む)の上に重ねて動作します。このプラグインは、sigレベルの型では到達できない2つの精度向上ステップを追加します。ランタイム依存はありません。

rigortypeにバンドルされて配布されます。plugins:の下で(キャリア(carrier)型を供給するrigor-sorbetとともに)有効化します。

plugins:
- rigor-sorbet
- rigor-mangrove

何を推論するか — 診断なし、設定なし

Section titled “何を推論するか — 診断なし、設定なし”

このプラグインは独自の診断を発行せず、設定も持ちません。2箇所で型を提供します。その後、エンジンの通常のメソッド存在チェックが、今や既知となった型に対するタイプミスを捕捉します。

unwrap系の戻り値の型。レシーバーが型引数を運んでいるMangroveのキャリアである場合、unwrapの戻り値はその引数にナローイング(narrowing)されます。

# token : Result::Ok[String, StandardError]
session.token.unwrap!.uppercaze # error: String に対して未定義のメソッド `uppercaze'

Enumバリアントの合成(ADR-36のSlice A)variantsDSLはランタイムでネストされたサブクラスを発行します。プラグインはそれらを静的に合成します ── バリアント定数が解決され、.newがディスパッチされ、型付けされた#innerリーダーが宣言されたペイロード型を返します。

class Shape
extend Mangrove::Enum
variants do
variant Circle, Float
end
end
Shape::Circle.new(1.5).inner.floor # ok — Float
Shape::Circle.new(1.5).inner.no_such_float_method # error: Float に対して未定義
  • コンストラクタからのジェネリック推論はないResult::Ok.new("x")は型引数のないキャリアを生むため、そこでのunwrapは何も提供しません(保守的なno-opであり、偽陽性は決して起こりません)。
  • ダウンキャストのナローイングは型引数を保持しない(ADR-36のSlice B、保留)is_a?を介して親のジェネリックをバリアントへナローイングしても、継承エッジを通して型引数が運ばれることはまだありません。
  • 定数でないペイロードのシェイプは劣化する。ペイロードがシェイプ(shape)ハッシュ({ name: String })であるバリアントは、Dynamic[Top]にフォールバックします。

キャリアジェネリックのインスタンス化、NestedClassTemplateによるバリアント合成、そしてrigor-sorbetとの関係は、プラグインのREADMEにあります。合成のtierはADR-36です。プラグインの書き方については、examples/rigor-plugin-authorスキルを参照してください。

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