検証ルール

検証フラグは、特殊な動作を提供します。

ルール "Rule1" が存在せず、"Validator" というルール フラグをつけられた Rule1 が存在する場合は、検証は Rule1 の結果の検証やフィルタを提供します。

検証フラグを使用するルールは、検証ルールと呼ばれています。同じ名前の別のルールは、ターゲット ルールです。ターゲットのルールが参照されるとき、まだバインドされていない場合は、代わりに検証が評価されます。検証の評価時には、ターゲット ルールのあらかじめ検証された値を取得し(通常しますが、必須ではありません)、必要とする方法でそれを処理して、ターゲット ルールの値として結果を返します。検証ルールはキャッシュされず、直接参照もされません。名前が Rule1 であるターゲット ルールの場合、検証ルールは、Rule1_%%vtor を使用するメソッドとなるように内部で再び書き込まれます。

Rule1 への外部参照はすべて、Rule1_%%vtor によって返される値を取得します。Rule1_%%vtor 内部の、Rule1 への参照はすべて、検証なしの値(未処理の値)を取得します。検証ルールの作成者は、未処理の値を調べて変更、または置き換え、またはそれをもとにエラーを生成することができます。

ターゲット ルールと検証ルールには、同じ種類のデータが必要であり、そうでなければ例外が発生します。

他のフラグと制限事項

ターゲット ルールは任意の標準ルール フラグを持つことができますが、グループ、またはメソッドなどの任意の特別なルール タイプとなることはできません。ルックアップおよびその他の既定値に関する動作は、検証が他のすべての動作が適用した後の "最後" に実行されます。したがって、ルックアップから得られる値は検証されます。

検証ルールは、検証以外のすべてのフラグを無視します。

検証は存在しますが、検証には評価されない一致する基本ルールはありません。コンパイル中に警告が発行される場合があります。

検証ルールは動的ルールでない場合があります。ただし、ターゲット ルールは動的である場合があります。

検証およびターゲット ルールは、同じデザイン上(または、動的の場合はパーツ上)に存在する必要があります。これらは一致を "ルックアップ" しません。

次の Intent ソース コードを考慮してください。

'! Intent Language(tm) 3.0
Design Validator : BasePart
	Parameter Rule Ex1 As Integer = 42
	Validator Rule Ex1 As Integer
		If (Ex1 < 0) Then
			Return 0
		Else If (Ex1 > 100) Then
			Return 100
		End If
		Return Ex1
End Rule
End Design

Ex1 に整数が指定されているかどうかに関係なく、0 から 100 までをすべて含んだ値を返します。

テストでは、Ex1_%%vtor をメソッドとして呼び出すことは適切です。これは検証された 1 つの引数を返します。

これは間接的に検証 Ex1 の Ex1 を参照する循環になります。たとえば、Ex2 が Ex1 を参照し、Ex1_validator が Ex2 を参照した場合は、循環参照が検出されます。これは、Ex2 は検証後に Ex1 にのみアクセスできますが、検証は呼び出し時に評価されるためです。