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.Scale
、v.Sub
是结构体变量 v
的方法,当它们被当成值来使用时,被称为方法值,比如上例中,它们先后被赋值给了 op
。方法值可以像普通函数值那样被调用,并且调用时可以影响方法上关联的引用(就如同直接调用原始方法那样),由此可见方法值捕获了原始对象引用,是带状态
的,在这一点上,方法值与闭包存在相似性。
从上例中还可以得知:函数值变量(比如例中的 op
),既可以存储函数值,也可以存储方法值,对调用方(caller)来说,二者没有区别。