例子
下面的例子中,Trait中擁有foo方法,Foo類型中也有foo方法,并且為Foo實作特征Trait時,在其中調用自己的foo方法,代碼如下:
trait Trait {
fn foo(&mut self, x: i32);
}
struct Foo;
impl Foo {
fn foo(&self) {
println!("Foo::foo");
}
}
impl Trait for Foo {
fn foo(&mut self, x: i32) {
//self.foo(); //1、出錯點1
(&*self).foo(); //按照此方式或者Self::foo(self)調用ok
println!("Trait::foo {}", x);
}
}
fn main() {
let mut a: Foo = Foo{};
a.foo();
//a.foo(3); //2、出錯點2,此方式調用出錯
Trait::foo(&mut a, 3);
println!("Hello, world!");
}
知識點一
描述
在上述代碼中,出錯點1的位置,如果直接調用self.foo()會出錯,但是調用(&*self).foo()或者Self::foo(self)則編譯通過。
原因解釋
Rust在進行方法解析的時候試用的規則比較簡單,編譯器檢視方法“ receiver”(點之前的東西,在本例中為self,其類型為&mut Foo),并檢查它是否具有稱為foo的方法。如果沒有foo方法,則嘗試借用或取消引用接收方後,再次檢查是否有此方法。編譯器會一直重複此過程,直到找到比對的方法為止。
在此例中,編譯器就會比對到fn foo(&mut self, x: i32)方法,是以按照出錯點1的寫法會出錯,正确的方式是将顯示的調用,調用方式為:
(&\*self).foo()
或者
Self::foo(self)
知識點二
描述
在main函數中使用以下代碼調用:
let mut a: Foo = Foo{};
a.foo();
總是預設的調用Foo類型的foo方法,那麼如果要調用trait中的方法怎麼辦呢?如果直接使用以下代碼會出錯(對應上述代碼中的出錯點2):
a.foo(3); //出錯
那麼要調用trait中的方法怎麼辦呢?
解決方式
Trait::foo(&mut a, 3);