• Var语句

    Var语句

    Var语句声明新的局部变量和全局变量并初始化它们。 逗号分隔的变量列表可用于指定相同类型的变量:

    1. var
    2. a: int = 0
    3. x, y, z: int

    如果给出初始值设定项,则可以省略该类型:该变量的类型与初始化表达式的类型相同。 如果没有初始化表达式,变量总是使用默认值初始化。 默认值取决于类型,并且在二进制中始终为零。

    类型默认值
    any integer type0
    any float0.0
    char'\0'
    boolfalse
    ref or pointer typenil
    procedural typenil
    sequence@[]
    string""
    tuple[x: A, y: B, …](default(A), default(B), …) (analogous for objects)
    array[0…, T][default(T), …]
    range[T]default(T); this may be out of the valid range
    T = enumcastT; this may be an invalid value

    出于优化原因,可以使用 noinit 编译指示来避免隐式初始化:

    1. var
    2. a {.noInit.}: array[0..1023, char]

    如果一个proc用 noinit 编译指示注释,则指的是它隐含的 result 变量:

    1. proc returnUndefinedValue: int {.noinit.} = discard

    隐式初始化可以用 requiresInit 类型编译指示阻止。 编译器需要对对象及其所有字段进行显式初始化。 然而它执行 控制流分析 证明变量已经初始化并且不依赖于语法属性:

    1. type
    2. MyObject = object {.requiresInit.}
    3.  
    4. proc p() =
    5. # 以下内容有效:
    6. var x: MyObject
    7. if someCondition():
    8. x = a()
    9. else:
    10. x = a()
    11. # use x