方法
方法定义
跟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编译器增加了限制,如果方法的接收者是可变的话,也就是在方法中修改了结构体字段,就不允许链式调用,希望后续的版本能够重新支持。
以下示例代码可以编译通过:
以下示例代码无法编译通过,因为方法的接收者是可变的:
最后更新于
这有帮助吗?