コンテンツにスキップ

インポートされた組み込み型

Rigorは明確なRubyの意味を持つ場合にのみ、PHPStan、TypeScript、Pythonの型付けからアイデアをインポートします。デフォルトでは互換性のために外来構文は保持されません。

この文書はRigorがリファインメントと型関数に使う予約済み組み込み名前を定義します。これらの名前を裏打ちする内部形式はrigor-extensions.mdにカタログ化されています。演算子形式(~TT - Ukey_of[T]など)はtype-operators.mdにあります。

  • 予約済み組み込みリファインメント名はnon-empty-stringpositive-intnon-empty-array[T]のようにkebab-caseを使います。
  • リファインメント名は絞り込まれたRuby値ドメインを記述し、RubyのconstantやRBSエイリアス名ではなく、Rigor予約型名として解析されます。
  • -文字は意図的なものです: Rubyのconstantやアメスラ名では有効ではないため、non-empty-stringのような名前は視覚的かつ構文的にRigor組み込みとしてマークされます。
  • Rigorはnon_empty_stringのようなリファインメント名のlower_snakeエイリアスを追加してはなりません(MUST NOT)。それらの名前は通常のRBS型エイリアスとして利用可能なままです。
  • パラメータ化された型関数と型レベル操作はkey_of[T]のようにlower_snake名と角括弧引数を使います。
  • 型関数は別の型またはリテラルセットを計算、投影、または変換するものであり、絞り込まれた値ドメインに直接名前をつけるものではありません。
  • 型関数が-を避けるのは、-がRigorの型構文では差分演算子でもあるためです; int_mask[1, 2, 4]int-mask[1, 2, 4]より曖昧さが少ないです。
  • 具体的な移行や可読性の問題を解決しない限り、互換性エイリアスを受け付けてはなりません(MUST NOT)。
  • RBS名はすでにその概念を表現している場合は正規のままです。botはボトム型です; nevernoreturnnever-returnnever-returnsno-returnNeverNoReturnは初期エイリアスとして追加してはなりません(MUST NOT)。
  • 整数範囲はInteger[1..10]のようにRigorの範囲表記を使います。PHPStanスタイルのint<1, 10>は初期エイリアスとして追加してはなりません(MUST NOT)。

初期スカラーリファインメント

Section titled “初期スカラーリファインメント”
Rigor型意味RBS消去
non-empty-string""を除くStringString
literal-stringソースリテラルとリテラルのみの合成から来ることが既知の文字列。v0.0.9はすべてのオペランド自体がリテラルを持つString#+ / String#*による文字列補間"#{...}"を通じて、またString#<< / String#concat(その戻り値はレシーバーであるため、リテラルを持つレシーバーとリテラルを持つ引数はliteral-stringのままです)を通じてキャリア(carrier)を追跡します。String
numeric-stringRigorのRuby数値文字列述語が受け付けるStringString
decimal-int-stringRigorのRuby10進整数文字列述語が受け付けるStringString
octal-int-stringRigorのRuby8進整数文字列述語が受け付けるStringString
hex-int-stringRigorのRuby16進整数文字列述語が受け付けるStringString
lowercase-string小文字正規化と等しいStringString
non-lowercase-string小文字正規化と等しくないString(つまり少なくとも1つの非小文字文字を含む)。~Tの下でのlowercase-stringのペア補完String
uppercase-string大文字正規化と等しいStringString
non-uppercase-string大文字正規化と等しくないString。~Tの下でのuppercase-stringのペア補完String
non-numeric-stringRigorのRuby数値文字列述語が受け付けないString。~Tの下でのnumeric-stringのペア補完String
non-empty-lowercase-stringnon-empty-string & lowercase-stringString
non-empty-uppercase-stringnon-empty-string & uppercase-stringString
non-empty-literal-stringnon-empty-string & literal-stringString
positive-int0より大きいIntegerInteger
negative-int0より小さいIntegerInteger
non-positive-int0以下のIntegerInteger
non-negative-int0以上のIntegerInteger
non-zero-int0を除くIntegerInteger

正規の小文字文字列名はlowercase-stringです;具体的な使いやすさの問題が現れない限り、lower-stringは別のエイリアスとして受け付けてはなりません(MUST NOT)。

数値リファインメントのスコープ

Section titled “数値リファインメントのスコープ”

整数リファインメントは意図的にIntegerのリファインメントであり、すべてのNumeric値の符号リファインメントではありません。Rubyの数値クラスは異なる等価、順序付け、昇格の挙動を持つため、Rigorは名前的数値境界を越えてpositive-intnegative-int、またはnon-zero-intを一般化してはなりません(MUST NOT)。

非整数数値リファインメントには別のルールがあります:

  • Floatリテラル等価と完全性ナローイング(narrowing)はデフォルトで拒否されます。NaN、無限大、符号付きゼロ、強制変換に敏感な比較はリテラルパーティションを誤って述べやすくします。Rigorはfloat比較から関係的ファクト(fact)を保持する場合があります(MAY)、また将来のfinite-floatまたは非NaN証明がより狭いfloat固有のリファインメントを解放する場合があります(MAY)。
  • Rationalは正確で順序付けられていますがIntegerではありません。Rationalの将来の符号または範囲ファクトはRational固有でなければならず(MUST)、*-int名を再使用してはなりません(MUST NOT)。
  • ComplexはRubyでは全順序を持たないため、正、負、区間リファインメントはComplexに適用してはなりません(MUST NOT)。ゼロ性、実部、虚部、または大きさに関するファクトには明示的な述語またはプラグイン/RBS効果が必要です。
  • 混合数値演算と比較は部分型(subtype)昇格ではなく、Rubyのメソッドディスパッチとcoerceに従います。リファインメントはIntegerからFloatRational、または別のNumericクラスに自動的に越境してはなりません(MUST NOT)。混合演算が既知の場合、結果型はRuby/RBS演算子シグネチャまたは信頼されたプラグインファクトに従います;そうでなければRigorは関係的または動的由来ファクトを保持し、保守的に拡幅します。

非整数数値精度は、*-intリファインメントの名前的数値境界を越えた静かな昇格によってではなく、将来の組み込み、信頼された述語、またはプラグインとRBS効果を通じてオプトインです。

初期コレクションとシェイプリファインメント

Section titled “初期コレクションとシェイプリファインメント”
Rigor型意味RBS消去
non-empty-array[T]少なくとも1つの要素を持つArray[T]Array[T]
オプショナルキーを持つハッシュシェイプ(shape)既知の必須およびオプショナルキーを持つHash正確な場合はRBSレコード、そうでなければHash[K, V]
追加キーポリシーを持つハッシュシェイプオープン、クローズ、または既知の値型の追加キーのみオープンなハッシュシェイプ正確でクローズドの場合はRBSレコード、そうでなければHash[K, V]
読み取り専用ハッシュシェイプエントリー現在の参照を通じて読み取ることはできるが書き込むべきでないキーエントリーのミュータビリティマーカーは消去
タプルリファインメント固定または有界な配列位置正確な場合はRBSタプル、そうでなければArray[T]
オブジェクトシェイプ既知の公開メソッドまたはシングルトンケイパビリティ(capability)を持つオブジェクト利用可能であれば名前付きインターフェース、そうでなければtopまたは名前的ベース

PythonのTypedDictはシェイプの正確性の語彙を提供します: 必須および非必須キー、読み取り専用エントリー、オープン、クローズド、または型付き追加キーポリシー。Rigorはそれらのアイデアをハッシュ、オプションハッシュ、キーワード引数に適用します。読み取り専用エントリーは現在の値のビューに対する静的な書き込み制限です;基礎となるRubyオブジェクトがfrozenであることを証明するものではありません

RigorはPHPStanのlist<T>non-empty-list<T>を別個の表面型として初期にインポートしてはなりません(MUST NOT)。Ruby Array[T]はすでにリスト的なインデックスセマンティクスを持ちます; non-empty-array[T]は別のスペルを追加せずに有用なリファインメントをカバーします。

Rigor形式意味
key_of[T]レコード、ハッシュシェイプ、タプル、またはシェイプ的型の既知キー
value_of[T]レコード、ハッシュシェイプ、タプル、またはシェイプ的型の既知値のユニオン(union、合併型とも)
pick_of[T, K]キーがKに含まれるものに制限されたレコード/シェイプ
omit_of[T, K]キーがKに含まれるエントリーが削除されたレコード/シェイプ
partial_of[T]Tの必須エントリーすべてを任意にしたレコード/シェイプ
required_of[T]Tの任意エントリーすべてを必須にしたレコード/シェイプ
readonly_of[T]Tの各エントリーを現在のビューで読み取り専用としてマークしたレコード/シェイプ
T[K]タプル、レコード、オブジェクトシェイプ、またはジェネリックコンテナメタデータへのインデックスアクセス
int_mask[1, 2, 4]0を含む、リストされたフラグのビットORで表現可能な整数
int_mask_of[T]有限整数リテラルユニオンまたは定数由来セットから導出されたビットマスク

key_of[T]は正規のスペルです。具体的なメリットがない限り、RigorはPHPStanスタイルのkey-of<T>とTypeScriptスタイルのkeyof Tの両方を受け付けてはなりません(MUST NOT)。

これらの演算子(および差分と補完演算子)の診断表示規則はtype-operators.mdで定義されています。

先送りまたは拒否されたインポート

Section titled “先送りまたは拒否されたインポート”

以下のインポートは意図的に提供されません。各項目は将来の提案が根拠を再議論することなく単一のルールを参照できるように記録されています。

  • PythonのAnyobjectはRigorのスペルになってはなりません(MUST NOT)。Rigorは動的境界にはuntypedを、最大の静的値型にはtopを使います。
  • PythonのNeverNoReturnbotのエイリアスになってはなりません(MUST NOT)。RBSはすでに正規のボトム型を提供しています。
  • PythonのProtocolTypedDictAnnotatedTypeGuardTypeIsFinalClassVarはRigor表面構文になってはなりません(MUST NOT)。それらの有用なアイデアはRBSインターフェース、Rigorシェイプリファインメント、%a{...}アノテーション、フロー効果、別個のシンボルまたはメンバーファクトにマッピングされます。
  • Pythonのtype[C]は構文としてインポートしてはなりません(MUST NOT)。RBSはクラスオブジェクトに対してすでにsingleton(C)を使います;将来のinstance_type[T]投影はRubyファクトリーAPIを中心に設計すべきです。
  • intfloatまたはcomplexに代入可能のようなPythonの数値昇格は直接インポートしてはなりません(MUST NOT)。Ruby数値挙動はRubyクラスとRBSシグネチャからモデル化されます。
  • class-stringinterface-stringtrait-stringenum-stringは先送りです。RubyはクラスとモジュールオブジェクトをDirectに渡すことができ、RBSはクラスオブジェクトにすでにsingleton(C)を持ちます。
  • PHPStanのnewのような型操作は将来の候補として残りますが、クラス名文字列ではなくRubyクラスオブジェクトを中心に設計されなければなりません(MUST)。例えば、将来のinstance_type[T]はファクトリーAPIがその精度を必要とするときにクラスオブジェクトによって作成されたインスタンス型を投影できます。
  • RubyではすべてのString値が真値であるため、non-falsy-stringtruthy-stringは追加してはなりません(MUST NOT)。
  • non-decimal-int-stringは初期に名前付き組み込みになってはなりません(MUST NOT); String - decimal-int-stringを使ってください。
  • emptyempty-scalarnon-empty-scalarnon-empty-mixedのようなPHPの真偽性指向型は直接インポートしてはなりません(MUST NOT)。Rigorはfalse | nilフローファクトと明示的なコレクション/文字列リファインメントでRubyの真偽性をモデル化します。
  • ExcludeExtractNonNullableは初期に表面エイリアスとしてインポートしてはなりません(MUST NOT)。RigorはそれらをT - UT & UT - nilとして表現します。オプトインのrigor-typescript-utility-typesプラグイン(ADR-13を参照)は、これらのTypeScript正準名を同じコア演算子に解決されるプラグイン提供語彙として登録してもよい(MAY)。
  • TypeScriptのユーティリティまたはマッピング型エイリアス(PartialRequiredReadonlyPickOmitRecordParametersReturnTypeInstanceType)は初期にRigor表面形式としてインポートしてはなりません(MUST NOT)。シェイプ射影系(PartialRequiredReadonlyPickOmit)は、上記表に従いコアの正準Rigor型関数(partial_of[T]required_of[T]readonly_of[T]pick_of[T, K]omit_of[T, K])を持つ;Record<K, V>はRBSのHash[K, V]で既に表現可能。TypeScript正準スペルはADR-13に従いオプトインのrigor-typescript-utility-typesプラグインを通じて提供され、各TS名を解析時にマッチするRigorコア演算子に変換する。関数型射影(ParametersReturnType)とクラス射影系(InstanceType)は、対応するコア演算子(params_of[F]return_of[F]instance_type[C])がランディングするまで先送り。

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