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