Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 2.39 KB

#003_变量.md

File metadata and controls

75 lines (51 loc) · 2.39 KB

2.1 变量

2.1.1 声明与使用

name := 'Bob'
age := 20
large_number := i64(9999999999)
println(name)
println(age)
println(large_number)

变量通过 := 来声明与初始化。这是在 V 中声明变量的唯一方式。这也意味着声明变量时必须赋初始值

变量的类型会通过 := 右边的值自动推断出来。想要选择不同的类型,使用类型转换:表达式 T(v) 将值 v 转换成类型 T

与其他编程语言不同,V 只允许在函数中定义变量。全局变量(模块层级)是不允许的,V 中没有全局状态。

为了在不同的代码库之间保持一致性,所有变量和函数名都必须使用 snake_case 样式,而类型名必须使用 PascalCase

2.1.2 可变变量

mut age := 20
println(age)
age = 21
println(age)

改变变量值使用 =。在 V 中,变量默认都是不可变的。想要定义可改变值的变量,需要通过 mut 声明。

试着去掉第一行的 mut 之后再次运行上面代码。

2.1.3 初始化与分配

注意 :== 之间的(重要)区别。:= 用来声明与初始化变量值,= 用来赋值。

fn main() {
    age = 21
}

这段代码无法编译,因为变量 age 没有声明。V 中所有变量都需要声明。

fn main() {
    age := 21
}

可以在一行代码内改变多个变量的值。这样,两个变量进行值交换不需要借助中间变量就可以完成。

mut a := 0
mut b := 1
println('$a, $b') // 0, 1
a, b = b, a
println('$a, $b') // 1, 0

2.1.4 声明错误

开发模式中编译器会警告你没有使用某个变量(你会收到“unused variable”警告)。生产模式中(通过传递 -prod 标志给 v 比如 v -prod foo.v 来打开)根本不会编译(就像 Go 那样)。

fn main() {
    a := 10
    if true {
        a := 20 // error: redefinition of `a`
    }
    // warning: unused variable `a`
}

与大多数语言不同,V 不允许变量重复(variable shadowing)。使用已在父范围中使用的名称来声明变量将导致编译错误。

但是你可以重复使用导入的模块名来声明变量,一些场合下非常有用:

import ui
import gg

fn draw(ctx &gg.Context) {
    gg := ctx.parent.get_ui().gg
    gg.draw_rect(10, 10, 100, 50)
}