特征使用示例1:
use std::ops::Add;
//直接输出Point的值
#[derive(Debug)]
struct Point<T: Add<Output = T>> {
x: T,
y: T,
}
//为Point实现Add trait
impl<T:Add<T,Output=T>> Add for Point<T>{
type Output=Point<T>;
fn add(self,p:Point<T>)->Point<T>{
Point { x:self.x+p.x, y:self.y+p.y }
}
}
fn add<T:Add<T,Output=T>>(a:T,b:T)->T{
a+b
}
fn main(){
let p1=Point { x:1, y:2 };
let p2=Point { x:3, y:4 };
// let p3=p1+p2;
// println!("p3.x={},p3.y={}",p3.x,p3.y);
println!("p3={:?}",add(p1,p2));
}
特征重写内置的Display
//实际生产中需要自定义输出
use std::fmt;
use std::fmt::{Display};
#[derive(Debug,PartialEq)]
enum FileState{
Open,
Closed,
}
#[derive(Debug)]
struct File{
name:String,
data:Vec<u8>,
state:FileState,
}
impl Display for FileState{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
//模式匹配
match *self{
FileState::Open=>write!(f,"Open"),
FileState::Closed=>write!(f,"Closed"),
}
}
}
impl Display for File{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
write!(f,"rewrite <{} ({})>",
self.name,self.state)
}
}
impl File{
fn new(name:&str)->File{
File{
name:String::from(name),
data:Vec::new(),
state:FileState::Closed,
}
}
}
fn main(){
let file=File::new("fistrust/src/main.rs");
println!("{:?}",file);
println!("{}",file);
}