别名¶
别名是现有 QL 实体的替代名称。
定义别名后,您可以在当前模块的 命名空间 中使用该新名称来引用该实体。
定义别名¶
您可以在任何 模块 的主体中定义别名。为此,您应指定
- 关键字
module
、class
或predicate
,分别为 模块、类型 或 非成员谓词 定义别名。 - 别名的名称。这应该是该类型实体的有效名称。例如,有效的谓词别名以小写字母开头。
- 对 QL 实体的引用。这包括实体的原始名称,以及对于谓词,谓词的元数。
您还可以对别名进行注释。请参阅可用于别名的 注释 列表。
请注意,这些注释适用于别名引入的名称(而不是底层 QL 实体本身)。例如,别名可以对其别名名称具有不同的可见性。
模块别名¶
使用以下语法为 模块 定义别名
module ModAlias = ModuleName;
例如,如果您创建了一个名为 NewVersion
的新模块,它是 OldVersion
的更新版本,您可以如下弃用 OldVersion
名称
deprecated module OldVersion = NewVersion;
这样,这两个名称都解析为同一个模块,但如果使用 OldVersion
名称,则会显示弃用警告。
类型别名¶
使用以下语法为 类型 定义别名
class TypeAlias = TypeName;
请注意,class
只是一个关键字。您可以为任何类型定义别名,即 基本类型、数据库类型 和用户定义的 类。
例如,您可以使用别名将基本类型 boolean
的名称缩写为 Bool
class Bool = boolean;
或者,要使用 OneTwoThreeLib.qll
中 模块 M
中定义的类 OneTwo
,您可以创建一个别名以使用更短的名称 OT
import OneTwoThreeLib
class OT = M::OneTwo;
...
from OT ot
select ot
谓词别名¶
使用以下语法为 非成员谓词 定义别名
predicate PredAlias = PredicateName/Arity;
例如,假设您经常使用以下谓词,它计算小于十的正整数的后继
int getSuccessor(int i) {
result = i + 1 and
i in [1 .. 9]
}
您可以使用别名将名称缩写为 succ
predicate succ = getSuccessor/1;
作为不带结果的谓词示例,假设您有一个对所有小于十的正整数都成立的谓词
predicate isSmall(int i) {
i in [1 .. 9]
}
您可以如下为谓词赋予更具描述性的名称
predicate lessThanTen = isSmall/1;