能否为Ada记录类型使用Static_Predicate?如何实现?
如何为Ada记录类型应用Static_Predicate?
你尝试为带判别式的记录类型Irregular_Matrix添加Static_Predicate,但编译器始终报错:static predicate requires scalar or string type,即使使用简单的静态表达式也无法解决。
你的原始代码如下:
-- irregular_matrices.ads generic type Element_Type is private; package Irregular_Matrices is subtype Index_Type is Positive; type Row_End_Array is array (Index_Type range <>) of Index_Type; type Element_Array is array (Index_Type range <>) of Element_Type; type Irregular_Matrix (Row_Count : Natural; Element_Count : Natural) is record Indices : Row_End_Array (1 .. Row_Count); Elements : Element_Array (1 .. Element_Count); end record with Static_Predicate => -- static expression ; type Cursor is record Row, Element : Index_Type; end record; procedure Iterate ( A_Matrix : Irregular_Matrix; With_Procedure : not null access procedure (Position : Cursor) ); end Irregular_Matrices;
问题原因
Ada语言规范中,Static_Predicate仅支持标量类型(如整数、枚举、字符)或字符串类型,记录类型(哪怕带判别式)并不在支持范围内。编译器的错误提示已经明确指出了这一点,这就是你尝试各种表达式都失败的核心原因。
解决方案:使用Dynamic_Predicate
如果需要对记录类型的结构(包括判别式与字段的关系、字段自身的约束)进行检查,应改用Dynamic_Predicate。它支持记录类型,会在运行时验证约束条件。
修改后的代码示例:
-- irregular_matrices.ads generic type Element_Type is private; package Irregular_Matrices is subtype Index_Type is Positive; type Row_End_Array is array (Index_Type range <>) of Index_Type; type Element_Array is array (Index_Type range <>) of Element_Type; type Irregular_Matrix (Row_Count : Natural; Element_Count : Natural) is record Indices : Row_End_Array (1 .. Row_Count); Elements : Element_Array (1 .. Element_Count); end record with Dynamic_Predicate => -- 确保索引数组长度匹配行数量 Indices'Length = Row_Count -- 确保元素数组长度匹配元素总数 and Elements'Length = Element_Count -- 最后一行的结束索引不超过元素总数 and Indices(Row_Count) <= Element_Count -- 确保索引严格递增(符合不规则矩阵的结构逻辑) and (for all I in Indices'First .. Indices'Last - 1 => Indices(I) < Indices(I+1)); type Cursor is record Row, Element : Index_Type; end record; procedure Iterate ( A_Matrix : Irregular_Matrix; With_Procedure : not null access procedure (Position : Cursor) ); end Irregular_Matrices;
补充说明
Dynamic_Predicate会在以下场景触发检查:
- 记录对象初始化时
- 记录对象被赋值时
- 显式调用
Valid属性检查时
如果需要对判别式做静态约束,可以通过子类型或判别式默认值实现,但涉及字段和判别式之间的复杂关联约束,只能依赖动态谓词完成运行时验证。
内容的提问来源于stack exchange,提问作者tymurmchyk
相关产品推荐
相关产品推荐

