static[T]

顾名思义,静态参数必须是常量表达式:

  1. proc precompiledRegex(pattern: static string): RegEx =
  2. var res {.global.} = re(pattern)
  3. return res
  4.  
  5. precompiledRegex("/d+") # 用预编译的正则表达式替换调用,存储在全局变量中
  6.  
  7. precompiledRegex(paramStr(1)) # 错误,命令行选项不是常量表达式

出于代码生成的目的,所有静态参数都被视为通用参数 - proc将针对每个唯一提供的值(或值的组合)单独编译。

静态参数也可以出现在泛型类型的签名中:

  1. type
  2. Matrix[M,N: static int; T: Number] = array[0..(M*N - 1), T]
  3. # 注意 `Number` 在这里只是一个类型约束,而 `static int` 要求我们提供一个int值
  4.  
  5. AffineTransform2D[T] = Matrix[3, 3, T]
  6. AffineTransform3D[T] = Matrix[4, 4, T]
  7.  
  8. var m1: AffineTransform3D[float] # 正确
  9. var m2: AffineTransform2D[string] # 错误 `string`不是`Number`

请注意,static T 只是底层泛型类型 static[T] 的语法方便。 可以省略类型参数以获取所有常量表达式的类型类。 可以通过使用另一个类型类实例化 static 来创建更具体的类型类。

您可以通过将表达式强制转换为相应的 static 类型来强制将表达式在编译时作为常量表达式进行求值:

  1. import math
  2.  
  3. echo static(fac(5)), " ", static[bool](16.isPowerOfTwo)

编译器将报告任何未能评估表达式或可能的类型不匹配错误。