泛型过程

让我们考虑泛型 proc 的构造,以就定义的术语达成一致。

  1. p[T: t](arg1: f): y
  • p: 被调用方符号
  • […]: 泛型参数
  • T: t: 泛型约束
  • T: 类型变量
  • [T: t](arg1: f): y: 正式签名
  • arg1: f: 正式参数
  • f: 正式参数类型
  • y: 正式返回类型

这里使用”正式”一词是为了表示程序员定义的符号,而不是编译时上下文中的符号。 由于泛型可以被实例化并且类型绑定,当涉及泛型时,我们需要考虑多个实体。

泛型的使用将正式定义的表达式解析为仅绑定到具体类型的该表达式的实例。这个过程被称为”实例化”。

在泛型的正式定义位置使用的括号指定了”约束”,如:

  1. type Foo[T] = object
  2. proc p[H;T: Foo[H]](param: T): H

约束定义可以通过使用 ; 分隔每个定义来定义多个符号。 请注意, T 是由 H 组成的,而 p 的返回类型被定义为 H 。 当此泛型过程被实例化时, H 将绑定到一个具体类型,从而使 T 具体化,并且 p 的返回类型将绑定到用于定义 H 的相同具体类型。

在使用位置的括号中,可以按照约束中定义符号的顺序提供具体类型来实例化泛型。 另外,在某些情况下,编译器可以推断类型绑定,从而使代码更加简洁。