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

2018-08-12 22:03 更新

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

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

如果我們試圖調(diào)用 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ù)調(diào)用語法”,它這種語法看起來是下面這樣的:

Foo::f(&b);
Bar::f(&b);
我們讓它停止一下。
Foo::
Bar::

這些部分調(diào)用的類型有兩個特征:Foo 和 Bar。這最終實(shí)際上是做了兩者之間的消歧:Rust 從兩者中調(diào)用你所使用的特征名稱。

f(&b)

當(dāng)我們用 method syntax()調(diào)用一個方法比如 b.f(),如果 f() 含有 &self,Rust 會自動 borrow b。在本例這種情況下,Rust 不會,所以我們需要傳遞一個具體的 &b。

尖括號形式

現(xiàn)在我們談?wù)撘幌?UFCS 形式:

Trait::method(args);

這只是一種速記收手法。下面是在某些情況下需要使用的擴(kuò)展形式:

<Type as Trait>::method(args); 

< >:: 語法是一種提供類型提示的方法。類型寫在 < >s 里面。在本例中,類型是 Type as Trait 表明我們希望特征的方法在這里被調(diào)用。在不出現(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);
    }
    }

這將調(diào)用 Clone 特征的 Clone () 方法,而不是 Foo 特征的方法。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號