Var语句
Var 语句声明新的局部和全局变量并初始化它们。逗号分隔的变量列表可用于指定相同类型的变量:
var
a: int = 0
x, y, z: int
如果给定了初始化器,则可以省略类型: 变量的类型与初始化表达式的类型相同。如果没有初始化表达式,则始终使用默认值初始化变量。默认值取决于类型,并且在二进制中始终为零。
类型 | 默认值 |
---|---|
任意整数 | 0 |
任意浮点数 | 0.0 |
字符 | ‘\0’ |
布尔 | false |
引用和指针 | nil |
过程 | nil |
序列 | @[] |
字符串 | “” |
tuple[x: A, y: B, …] | (zeroDefault(A), zeroDefault(B), …) (analogous for objects) |
array[0…, T] | [zeroDefault(T), …] |
range[T] | default(T); 这个有可能超出有效范围 |
T = enum | castT; 这个有可是无效值 |
出于优化原因,可以使用 noinit “无初始化”编译指示来避免隐式初始化:
var
a {.noinit.}: array[0..1023, char]
如果 proc 使用 noinit 编译指示,这指的是其隐式 result 变量:
proc returnUndefinedValue: int {.noinit.} = discard
requiresInit “需初始化”类型编译指示也可以防止隐式初始化。 编译器需要对对象及其所有字段进行显式初始化。 但是,它会进行 control flow analysis “控制流分析” 以验证变量已被初始化并且不依赖于语法属性:
type
MyObject {.requiresInit.} = object
proc p() =
# 以下是有效的:
var x: MyObject
if someCondition():
x = a()
else:
x = a()
# 使用 x
requiresInit 编译指示也可以应用于 distinct 类型。
给出以下 distinct 类型定义:
type
Foo = object
x: string
DistinctFoo {.requiresInit, borrow: `.`.} = distinct Foo
DistinctString {.requiresInit.} = distinct string
下列代码块将会编译失败:
var foo: DistinctFoo
foo.x = "test"
doAssert foo.x == "test"
var s: DistinctString
s = "test"
doAssert string(s) == "test"
但这些将会编译成功:
let foo = DistinctFoo(Foo(x: "test"))
doAssert foo.x == "test"
let s = DistinctString("test")
doAssert string(s) == "test"
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .