通用函數(shù)調(diào)用語(yǔ)法

2018-08-12 22:03 更新

通用函數(shù)調(diào)用語(yǔ)法

有時(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。

尖括號(hào)形式

現(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 特征的方法。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)