trait定義內(nèi)容總結(jié)自《The Rust Programing Language》
站在用戶的角度思考問題,與客戶深入溝通,找到邗江網(wǎng)站設(shè)計與邗江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋邗江地區(qū)。首先簡單說一下泛型:這個基礎(chǔ)和C++的模板大概類似,從語法編譯層面提供一種接收任意類型的手段,需要知道的是泛型在編譯時會進(jìn)行
單態(tài)化
處理,所以泛型是不會增加運(yùn)行時負(fù)擔(dān)的。熟悉C++的前提下,泛型應(yīng)該是看一下就可以很快入門,這里不贅述。
Rust通過 trait 以一種抽象的方式定義共享的行為??梢允褂?em>trait bounds指定泛型是任何擁有特定行為的類型,trait就類似其他語言的接口。trait 定義就是一種將方法簽名組合起來的方法,目的是定義一個實現(xiàn)某些目的所必需的行為的集合。
貼一下相干性
的概念:(感覺是常識)
不能為外部類型實現(xiàn)外部 trait。例如,不能在aggregator
crate 中為Vec
實現(xiàn)Display
trait。這是因為Display
和Vec
都定義于標(biāo)準(zhǔn)庫中,它們并不位于aggregator
crate 本地作用域中。這個限制是被稱為 相干性(coherence) 的程序?qū)傩缘囊徊糠?,或者更具體的說是 孤兒規(guī)則(orphan rule),其得名于不存在父類型。這條規(guī)則確保了其他人編寫的代碼不會破壞你代碼,反之亦然。
//trait定義的簡單例子
pub trait Summary {fn summarize_author(&self) ->String;
//trait方法支持默認(rèn)實現(xiàn)
fn summarize(&self) ->String {format!("(Read more from {}...)", self.summarize_author())
}
}
pub struct Tweet {pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for Tweet {fn summarize_author(&self) ->String {format!("@{}", self.username)
}
}
let tweet = Tweet {username: String::from("horse_ebooks"),
content: String::from("of course, as you probably already know, people"),
reply: false,
retweet: false,
};
println!("1 new tweet: {}", tweet.summarize());
trait適用場景使用 trait 來接受多種不同類型的參數(shù)。
//該函數(shù)接收一個trait參數(shù),那么只要是實現(xiàn)(impl)了Summary的類型都是有效參數(shù)
pub fn notify(item: impl Summary) {println!("Breaking news! {}", item.summarize());
}
//trait語法糖 trait bound
//這里強(qiáng)制item1,item2必須是相同的具體類型
pub fn notify(item1: T, item2: T) {//使用+號可以同時實現(xiàn)多個trait
pub fn notify(item: impl Summary + Display) {}//impl寫法
pub fn notify(item: T) {}//trait bound寫法
//通過where簡化trait bound
//顯得雜亂無章
fn some_function(t: T, u: U) ->i32 {}
//使用where之后好看多了
fn some_function(t: T, u: U) ->i32
where T: Display + Clone,
U: Clone + Debug
{}
//一個使用trait boud編寫函數(shù)的例子
fn largest(list: &[T]) ->T {let mut largest = list[0];
for &item in list.iter() {if item >largest {largest = item;
}
}
largest
}
//使用trait bound有條件的實現(xiàn)
//通過使用帶有 trait bound 的泛型參數(shù)的 impl 塊,可以有條件地只為那些實現(xiàn)了特定 trait 的類型實現(xiàn)方法。
//示例中的類型 Pair總是實現(xiàn)了 new 方法,
//不過只有那些為 T 類型實現(xiàn)了 PartialOrd trait (來允許比較)
//和 Display trait (來啟用打?。┑?Pair才會實現(xiàn) cmp_display 方法:
#![allow(unused)]
fn main() {use std::fmt::Display;
struct Pair{x: T,
y: T,
}
implPair{fn new(x: T, y: T) ->Self {Self {x,
y,
}
}
}
implPair{fn cmp_display(&self) {if self.x >= self.y {println!("The largest member is x = {}", self.x);
} else {println!("The largest member is y = {}", self.y);
}
}
}
}
trait 和 trait bound 讓我們使用泛型類型參數(shù)來減少重復(fù),并仍然能夠向編譯器明確指定泛型類型需要擁有哪些行為。因為我們向編譯器提供了 trait bound 信息,它就可以檢查代碼中所用到的具體類型是否提供了正確的行為。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧