Rust impl trait

trait特性

trait特性可以理解為Java中的接口翔怎,具備和接口很類似的特性配名。trait中的函數(shù)叫做方法鹉梨。某個(gè)結(jié)構(gòu)體要么實(shí)現(xiàn)某個(gè)trait的全部方法,要么全部不實(shí)現(xiàn)。其中的impl trait特性也類似與java中返回一個(gè)接口對(duì)象茴她。

在1.26版本后引入了存在類型(existential type的支持)寻拂,這個(gè)特性就是通過impl trait實(shí)現(xiàn),使得開發(fā)人員可以指定函數(shù)的返回類型丈牢,而不必具體指出是哪一種類型祭钉。

rust中返回trait對(duì)象的方法

方法一:引入Box

眾所周知,通過Box裝飾的變量保存在堆中己沛,而Box的大小是固定的慌核,只是通過一個(gè)指針指向堆中的變量,這樣就不會(huì)違背運(yùn)行時(shí)必須知道返回值大小的語法申尼,例子如下垮卓。

pub trait animal{
    fn print_name(&self);
}

struct cat{
    name:String
}

struct dog{
    name:String
}

impl animal for cat{
    fn print_name(&self){
        println!("{}",self.name);
    }
}

impl animal for dog{
    fn print_name(&self){
        println!("{}",self.name);
    }
}

fn who(who:i32)->Box<dyn animal>{
    if who== 1{
        Box::new(cat{name:"cat".to_string()}) as Box<dyn animal>
    } else{
        Box::new(dog{name:"dog".to_string()}) as Box<dyn animal>
    }
}

fn main(){
    let a = who(1);
    a.print_name();
}

方法二 impl trait

impl trait只能返回相同類型的trait。比如對(duì)比上面的Box的動(dòng)態(tài)分配师幕,
只能都返回cat或都返回dog粟按。這樣就決定了返回值的大小是固定的。

pub trait animal{
    fn print_name(&self);
}

struct cat{
    name:String
}

struct dog{
    name:String
}

impl animal for cat{
    fn print_name(&self){
        println!("{}",self.name);
    }
}

impl animal for dog{
    fn print_name(&self){
        println!("{}",self.name);
    }
}

fn who(who:i32)->impl animal{ //注意只能返回同一個(gè)類型
    if who== 1{
        cat{name:"cat one ".to_string()}
    } else{
        cat{name:"cat two ".to_string()}
    }
}

fn main(){
    let a = who(1);
    a.print_name();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霹粥,一起剝皮案震驚了整個(gè)濱河市灭将,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后控,老刑警劉巖庙曙,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異忆蚀,居然都是意外死亡矾利,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門馋袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舶斧,你說我怎么就攤上這事欣鳖。” “怎么了茴厉?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵泽台,是天一觀的道長。 經(jīng)常有香客問我矾缓,道長怀酷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任嗜闻,我火速辦了婚禮蜕依,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己样眠,他們只是感情好友瘤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檐束,像睡著了一般辫秧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上被丧,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天盟戏,我揣著相機(jī)與錄音,去河邊找鬼甥桂。 笑死柿究,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的格嘁。 我是一名探鬼主播笛求,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼糕簿!你這毒婦竟也來了探入?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤懂诗,失蹤者是張志新(化名)和其女友劉穎蜂嗽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殃恒,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡植旧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了离唐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片病附。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亥鬓,靈堂內(nèi)的尸體忽然破棺而出完沪,到底是詐尸還是另有隱情,我是刑警寧澤嵌戈,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布覆积,位于F島的核電站,受9級(jí)特大地震影響熟呛,放射性物質(zhì)發(fā)生泄漏宽档。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一庵朝、第九天 我趴在偏房一處隱蔽的房頂上張望吗冤。 院中可真熱鬧又厉,春花似錦、人聲如沸欣孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽降传。三九已至篷朵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婆排,已是汗流浹背声旺。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留段只,地道東北人腮猖。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像赞枕,于是被迫代替她去往敵國和親澈缺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容