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的用法是基本一致的。
未完待续...