Method
method就是隶属于某个结构体的函数,它们与普通函数没有本质区别。
所有的method都必须在impl块里声明,且method都会隐式的有个self
参数,该参数是impl
类型的指针
Method Example
最简单的添加method的例子:
impl impl_struct {
pub fn add1() void {
self.x = self.x + 1;
return;
}
pub fn set(x: i64) void {
self.x = x;
return;
}
}
在一个包中,可以定义该包中结构体的method
.
调用method的时候,使用<receiver类型>.<method>
即可
let a = A{};
a.method();
Extension Method
实际上,如果一个结构体不在当前包中定义,我们可以仍然可以定义它实现 当前包中 Trait
的 method
。这种方法被称为extension method
。
pub trait Eq<S> {
fn eq(r:*S) bool;
}
impl <T:Eq<T>> Eq<[T]> for [T] {
fn eq(r:*[T]) bool {
if arr_len(*self) != arr_len(*r) {
return false;
}
for let i = 0; i < arr_len(*self); i = i + 1 {
if !(*self)[i].eq(&(*r)[i]) {
return false;
}
}
return true;
}
}
当然,你也可以合法的为本包中的结构体实现子包(或本包)中的Trait
,但是这种情况下的method
不属于extension method
。
与普通method的区别
extension method
与普通method
的区别在于其作用域,普通method
的作用域与其所在的结构体相同,只要出现了该结构体类型就一定可以使用他的
method
(这里的出现不止指显示的引入结构体,通过函数返回值等方式间接的获取该类型的值也算)。
而extension method
的作用域则是在Trait
所在的包中,要使用extension method
,必须直接或者间接的依赖了该Trait
所在的包。