鍍金池/ 教程/ Java/ 通用函數(shù)調用語法
While 循環(huán)
宏命令
模式
Rust 嵌入到其他語言
變量綁定
if
發(fā)布通道
Lang 項目
匹配
文檔
棧和堆
不依賴 stdlib
原始指針
條件編譯
type 別名
關聯(lián)類型
全類型
詞匯表
基本類型
Hello, world!
測試
箱和模塊
字符串
向量
引用與借用
所有權
內斂函數(shù)
基準測試
Nightly Rust
for 循環(huán)
特征
特征的對象
鏈接參數(shù)
介紹
'Deref'強制轉換
枚舉
內聯(lián)匯編
泛型
方法語法
函數(shù)
外部函數(shù)接口
盒語法和模式
安裝 Rust
unsafe    
生存期
切片模式
Borrow 和 AsRef
If let
學習 Rust
“常量”和“靜態(tài)”
語法和語義
迭代器
相關學術研究
通用函數(shù)調用語法
哲學家就餐問題
類型轉換
閉包
并發(fā)性
Hello, Cargo!
屬性
注釋
結構體
編譯器插件
高效 Rust
相關常量
猜謎游戲
可變性
錯誤處理
新手入門
操作符和重載

通用函數(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;

如果我們試圖調用 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 特征的方法。

上一篇:測試下一篇:學習 Rust