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