You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ada泛型包中声明子程序访问类型的形式参数并进行空值判断?

解决Ada泛型包中访问类型空值检查的问题

你的问题核心在于泛型形式参数的声明范围太宽泛:你把Func_Type定义成了private类型,而Ada的private类型涵盖了所有数据类型(比如整数、字符串、普通记录等),这些非访问类型根本不支持和null进行相等性比较,所以编译器才会抛出错误。

要满足「形式参数为子程序访问类型并能做空值检查」的需求,你需要把泛型参数明确限定为访问类型(或更具体的子程序访问类型),下面是两种常用的正确写法:

1. 通用访问类型声明

这种写法允许任何访问类型(包括子程序访问类型、对象访问类型)作为实参传入,适用性更广:

generic
   type Func_Type is access type; -- 明确限定为访问类型
package Gen_Package is
   function Check(Func : Func_Type) return Boolean is (Func = null);
end Gen_Package;

2. 特定子程序访问类型声明

如果你需要严格限定实参是某类特定签名的子程序访问类型,可以直接在泛型参数里指定子程序的签名,比如无参数的过程访问类型:

generic
   -- 可根据实际需求调整子程序签名,比如带参数/返回值的function
   type Func_Type is access procedure;
package Gen_Package is
   function Check(Func : Func_Type) return Boolean is (Func = null);
end Gen_Package;

如果你的子程序有参数或返回值,只需修改access procedure后的签名即可,例如:

type Func_Type is access function (Input : Integer) return String;

调整后,泛型包的实参必然是支持null比较的访问类型,Func = null的写法会被编译器认可,空值检查也能正常工作。

内容的提问来源于stack exchange,提问作者user15552120

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:37:29