V函数默认是纯的,这意味着它们的返回值仅由它们的参数决定,并且它们的评估没有副作用。
这是通过缺少全局变量来实现的,默认情况下所有函数参数都是不可变的,即使传递了引用。
然而,V不是纯函数式语言。可以使用相同的关键字mut
修改函数参数:
struct User {
mut:
is_registered bool
}
fn (u mut User) register() {
u.is_registered = true
}
mut user := User{}
println(user.is_registered) // ==> "false"
user.register()
println(user.is_registered) // ==> "true"
在此示例中,接收器(它只是第一个参数)被标记为可变,因此register()
可以更改用户对象。同样适用于非接收者参数:
fn multiply_by_2(arr mut []int) {
for i := 0; i < arr.len; i++ {
arr[i] *= 2
}
}
mut nums := [1, 2, 3]
multiply_by_2(mut nums)
println(nums) // ==> "[2, 4, 6]
注意,在调用此函数时,必须在nums
之前添加mut
。这清楚地表明被调用的函数将修改该值。
最好返回值而不是修改参数。修改参数只应在应用程序的性能关键部分中完成,以减少分配和复制。
使用user.register()
或user = register(user)
而不是register(mut user)
。
V可以很容易地返回对象的修改版本:
fn register(u User) User {
return { u | is_registered: true }
}
user = register(user)