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();
}