• 默认都是纯函数

    默认都是纯函数

    V语言的函数默认是纯函数,也就是函数的输出结果只依赖输入的参数,并且没有其它的副作用。

    因为V语言没有全局变量,并且所有的参数默认都是只读的,即使传入的引用也是默认只读的。

    然后V语言并不纯的函数式语言。我们可以通过mut关键字让函数参数变得可以被修改:

    1. struct User {
    2. mut:
    3. is_registered bool
    4. }
    5. fn (u mut User) register() {
    6. u.is_registered = true
    7. }
    8. mut user := User{}
    9. println(user.is_registered) // ==> "false"
    10. user.register()
    11. println(user.is_registered) // ==> "true"

    在这个例子中,接收者参数u用mut关键字标注为可变的,因此方法内部可以修改user状态。mut也可以用于其它的普通参数:

    1. fn multiply_by_2(arr mut []int) {
    2. for i := 0; i < arr.len; i++ {
    3. arr[i] *= 2
    4. }
    5. }
    6. mut nums := [1, 2, 3]
    7. multiply_by_2(mut nums)
    8. println(nums) // ==> "[2, 4, 6]"

    注意,调用函数的时候也必须给nums增加mut关键字。这样可以清楚表达被调用的函数可能要修改这个值。

    最好是通过返回值返回结果,而不是修改输入的函数参数。修改参数尽量控制在程序性能比较关键的部分,这样可以即使那分配和复制的开销。

    使用user.register()user = register(user)代替 register(mut user)

    V语言可以用简洁的语法返回修改的对象:

    1. fn register(u User) User {
    2. return { u | is_registered: true }
    3. }
    4. user = register(user)