trait的中文翻譯是特性,初次接觸rust的trait概念,有點抽象,什麼是特性? 其實trait的行爲和C++/java中的虛函數/接口概念非常類似。站在這個角度去理解trait立馬恍然大悟了。
我們先從定義入手比較trait和接口的異同點。
用trait定義一個animal
pub trait animal{
fn eat(&self, food : String)->bool;
fn talk(&self, content : String)->String;
fn run(&self);
}
Java定義這個接口
public interface animal{
bool eat(String food);
String talk(String content);
void run();
}
是不是貌離而神合?抓住編程語言本質,就會發現很多語言設計思想是想通的。再看看實現情況:
Rust:
首先定義一種動物:Rabbit
pub struct Rabbit{
weight: u32;
age : u32;
color: u8;
foods: Vec<String>;
}
然後實現接口:
impl animal for Rabbit{
fn eat(&self, food : String)->bool {
let ret = false;
for i in self.foods{
if foods[i] === food{
ret = true;
break;
}
}
ret
}
fn talk(&self, content : String)->String{
let ret = "i am a rabbit";
ret
}
fn run(&self){
}
}
Java的接口實現:
class Rabbit implements Animal{
private ArrayList<String> foods;
public Rabbit(ArrayList<String> foods){
this.foods = foods;
}
bool eat(String food){
return foods.indexOf(food) != -1;
}
String talk(String content){
return "I am a rabbit";
}
void run(){
}
}
通過對比發現在Java和Rust中trait和interface的用法是基本一致的。
未完待續...