static[T]
顾名思义,静态参数必须是常量表达式:
- proc precompiledRegex(pattern: static string): RegEx =
- var res {.global.} = re(pattern)
- return res
- precompiledRegex("/d+") # 用预编译的正则表达式替换调用,存储在全局变量中
- precompiledRegex(paramStr(1)) # 错误,命令行选项不是常量表达式
出于代码生成的目的,所有静态参数都被视为通用参数 - proc将针对每个唯一提供的值(或值的组合)单独编译。
静态参数也可以出现在泛型类型的签名中:
- type
- Matrix[M,N: static int; T: Number] = array[0..(M*N - 1), T]
- # 注意 `Number` 在这里只是一个类型约束,而 `static int` 要求我们提供一个int值
- AffineTransform2D[T] = Matrix[3, 3, T]
- AffineTransform3D[T] = Matrix[4, 4, T]
- var m1: AffineTransform3D[float] # 正确
- var m2: AffineTransform2D[string] # 错误 `string`不是`Number`
请注意,static T
只是底层泛型类型 static[T] 的语法方便。 可以省略类型参数以获取所有常量表达式的类型类。 可以通过使用另一个类型类实例化 static 来创建更具体的类型类。
您可以通过将表达式强制转换为相应的 static 类型来强制将表达式在编译时作为常量表达式进行求值:
- import math
- echo static(fac(5)), " ", static[bool](16.isPowerOfTwo)
编译器将报告任何未能评估表达式或可能的类型不匹配错误。