6.3. 方法值

由于方法也是函数,因此可以仿照 4.2 节的模式使用它,例如:

// 版权 @2023 凹语言 作者。保留所有权利。

type Vertex struct{
    x, y: i32
}

func Vertex.Scale(s: i32) {
    this.x *= s
    this.y *= s
}

func Vertex.Sub(s: i32) {
    this.x -= s
    this.y -= s
}

func Vertex.Print {
    println("x:", this.x, "y:", this.y)
}

func FnOp(s: i32) {
    println("FnOp, s:", s)
}

func main {
    v := Vertex{x: 100, y:200}
    op : func(s: i32)

    op = FnOp // op此时是函数值FnOp
    op(13) // FnOp, s: 13

    op = v.Scale // op此时是方法值v.Scale
    op(2)
    v.Print() // x: 200 y: 400

    op = v.Sub // op此时是方法值v.Sub
    op(50)
    v.Print() // x: 150 y: 350
}

v.Scalev.Sub 是结构体变量 v 的方法,当它们被当成值来使用时,被称为方法值,比如上例中,它们先后被赋值给了 op。方法值可以像普通函数值那样被调用,并且调用时可以影响方法上关联的引用(就如同直接调用原始方法那样),由此可见方法值捕获了原始对象引用,是带状态的,在这一点上,方法值与闭包存在相似性。

从上例中还可以得知:函数值变量(比如例中的 op),既可以存储函数值,也可以存储方法值,对调用方(caller)来说,二者没有区别。