方法

方法定义

跟go一样:在函数名前面加接收者,就是方法。

接收者默认不可变,如果要修改接收者,要加上mut。

结构体方法可以定义在同一个模块目录的不同源文件中。

struct User {
mut:
	name string
	age  int
}

fn (u User) get_name() string {
	return u.name
}

fn (mut u User) set_name(name string) { //需要修改接收者,要加上mut
	u.name = name
}

fn (_ User) str() string { //如果不需要在方法中使用接收者,可使用下划线来忽略,当然也可以命名
	return 'User'
}

除了可以给结构体添加方法外,还可以给以下类型添加方法:

  • 枚举

  • 类型别名

  • 函数类型

  • 联合类型

  • 自定义数组类型

  • 自定义字典类型

方法作为变量

方法也可以像函数那样,作为变量,作为函数的参数和返回值,只要方法签名和函数类型的签名一致就可以。

更复杂的例子:

静态方法/类型方法

V语言支持静态方法,也叫类型方法,可以用来作为结构体的构造器,使用静态方法的好处是,静态方法的前缀默认是类名,这样就可以让调用时,静态方法名有了类名的限定,看起来更直观,更易理解。

不过,如果是跨模块调用,就会变为:模块名.类名.方法名,多了一个层级,除非使用短名称导入类。大规模使用短名称导入,又会导致导入方式不一致,看起来不是那么的统一。

方法链式调用

V语言支持方法链式调用。

只是新的V编译器增加了限制,如果方法的接收者是可变的话,也就是在方法中修改了结构体字段,就不允许链式调用,希望后续的版本能够重新支持。

以下示例代码可以编译通过:

以下示例代码无法编译通过,因为方法的接收者是可变的:

最后更新于

这有帮助吗?