W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí),函數(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;
如果我們?cè)噲D調(diào)用 b.f(),我們就會(huì)得到一個(gè)錯(cuò)誤:
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ù)調(diào)用語(yǔ)法”,它這種語(yǔ)法看起來(lái)是下面這樣的:
Foo::f(&b);
Bar::f(&b);
我們讓它停止一下。
Foo::
Bar::
這些部分調(diào)用的類型有兩個(gè)特征:Foo 和 Bar。這最終實(shí)際上是做了兩者之間的消歧:Rust 從兩者中調(diào)用你所使用的特征名稱。
f(&b)
當(dāng)我們用 method syntax()調(diào)用一個(gè)方法比如 b.f(),如果 f() 含有 &self,Rust 會(huì)自動(dòng) borrow b。在本例這種情況下,Rust 不會(huì),所以我們需要傳遞一個(gè)具體的 &b。
現(xiàn)在我們談?wù)撘幌?UFCS 形式:
Trait::method(args);
這只是一種速記收手法。下面是在某些情況下需要使用的擴(kuò)展形式:
<Type as Trait>::method(args);
< >::
語(yǔ)法是一種提供類型提示的方法。類型寫在 < >s
里面。在本例中,類型是 Type as Trait 表明我們希望特征的方法在這里被調(diào)用。在不出現(xiàn)歧義的情況下,特征部分是可選的。這同樣適用于用尖括號(hào)括,因此要用較短的形式。
這是使用更長(zhǎng)形式的一個(gè)例子:
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);
}
}
這將調(diào)用 Clone 特征的 Clone () 方法,而不是 Foo 特征的方法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: