有時,函數(shù)可以有相同的名字。看看下面這段代碼:
trait Foo {
fn f(&self);
}
trait Bar {
fn f(&self);
}
struct Baz;
impl Foo for Baz {
fn f(&self) { println!("Baz’s impl of Foo"); }
}
impl Bar for Baz {
fn f(&self) { println!("Baz’s impl of Bar"); }
}
let b = Baz;
如果我們試圖調用 b.f(),我們就會得到一個錯誤:
error: multiple applicable methods in scope [E0034]
b.f();
note: candidate #1 is defined in an impl of the trait `main::Foo` for the type
`main::Baz`
fn f(&self) { println!("Baz’s impl of Foo"); }
note: candidate #2 is defined in an impl of the trait `main::Bar` for the type
`main::Baz`
fn f(&self) { println!("Baz’s impl of Bar"); }
我們需要一種消除歧義的方法。這種方法稱為“通用函數(shù)調用語法”,它這種語法看起來是下面這樣的:
Foo::f(&b);
Bar::f(&b);
我們讓它停止一下。
Foo::
Bar::
這些部分調用的類型有兩個特征:Foo 和 Bar。這最終實際上是做了兩者之間的消歧:Rust 從兩者中調用你所使用的特征名稱。
f(&b)
當我們用 method syntax()調用一個方法比如 b.f(),如果 f() 含有 &self,Rust 會自動 borrow b。在本例這種情況下,Rust 不會,所以我們需要傳遞一個具體的 &b。
現(xiàn)在我們談論一下 UFCS 形式:
Trait::method(args);
這只是一種速記收手法。下面是在某些情況下需要使用的擴展形式:
<Type as Trait>::method(args);
< >::
語法是一種提供類型提示的方法。類型寫在 < >s
里面。在本例中,類型是 Type as Trait 表明我們希望特征的方法在這里被調用。在不出現(xiàn)歧義的情況下,特征部分是可選的。這同樣適用于用尖括號括,因此要用較短的形式。
這是使用更長形式的一個例子:
trait Foo {
fn clone(&self);
}
#[derive(Clone)]
struct Bar;
impl Foo for Bar {
fn clone(&self) {
println!("Making a clone of Bar");
<Bar as Clone>::clone(self);
}
}
這將調用 Clone 特征的 Clone () 方法,而不是 Foo 特征的方法。