• static[T]

    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)

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