繁体   English   中英

使用规则约束或子类型 Ada 中的 Unbounded_String?

[英]Constrain or subtype an Unbounded_String in Ada with rules?

对 Ada 来说是新手,但到目前为止很喜欢。 我可能会以一种菜鸟的方式问这个问题,因为我有点糊涂地写一些有用的东西作为我的尝试,但这里是:

我有一个使用Unbounded_String的系统,我想对它们应用一些规则,例如长度是否可被n整除或它们可以包含哪些字符。 有没有一种巧妙的方法来解决这个问题,以便我可以依靠类型系统进行验证?

您可以使用 Dynamic_Predicate 方面要求类型系统检查分配给变量的值:

with Ada.Strings.Unbounded;
package UB_Preds
is
   use Ada.Strings.Unbounded;

   subtype Even_Length_String is Unbounded_String
   with Dynamic_Predicate => Length(Even_Length_String) mod 2 = 0;

   subtype Lower_Case_String is Unbounded_String
   with Dynamic_Predicate =>
      (for all C of To_String(Lower_Case_String) => C in 'a' .. 'z');

end UB_Preds;

使用示例:如果您在启用断言检查的情况下进行编译(-gnata 用于 GNAT),这些声明将引发 Assert_Failure 因为分配的值使子类型的谓词失败:

Odd : UB_Preds.Even_Length_String := To_Unbounded_String ("ABC");
UC : UB_Preds.Lower_Case_String := To_Unbounded_String ("aBc");

第一个有三个字符,所以 Length mod 2 /= 0,而第二个有一个大写字符。

通常,断言检查的启用/禁用由 pragma Assertion_Policy 控制。 GNAT 的默认设置是忽略断言,但 -gnata 启用它们。

(当然,如果您使用 7 位 ASCII 以外的任何字符集,您应该使用 Ada.Characters.Handling 来测试小写/大写,而不是上面示例使用的简单范围。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM