Loading

QL语言参考-5别名.md

别名(Aliases)

别名是现有 QL 实体的替代名称。

定义了别名之后,可以使用该新名称引用当前模块命名空间中的实体。

定义别名

您可以在任何模块的主体中定义别名。为此,您应该指定:

  1. 关键字moduleclasspredicate分别为moduletype或非成员谓词non-member predicate定义别名。
  2. 别名的名称。这应该是此类实体的有效名称。例如,有效的谓词别名以小写字母开头。
  3. 对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;

或者,使用 OneTwoOneTwoThreeLib.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;
posted @ 2022-04-25 17:22  我是面包  阅读(218)  评论(0编辑  收藏  举报