Rust 特征与泛型区别点

用户头像
编号94530
关注
发布于: 2020 年 08 月 16 日
Rust特征与泛型区别点

1. Rust的特征与泛型



1.1 先上特征代码:



use std::boxed::Box;
// 定义一个特征
pub trait Animal{
fn bark(&self);
}
pub struct Dog{
pub name: String,
}
pub struct Chicken{
pub name: String,
}
// 实现一个特征
impl Animal for Dog{
fn bark(&self){
println!("{} : wang wang wang !",&self.name)
}
}
// 实现特征
impl Animal for Chicken{
fn bark(&self){
println!("{} : ji ji ji ~",&self.name)
}
}
pub struct Zoo{
// 用一个list装动物
pub components: Vec<Box<dyn Animal>>,
}
// 给Zoo实现一个方法
impl Zoo{
pub fn run(&self){
for c in self.components.iter() {
c.bark();
}
}
}



为什么先上代码? 因为这就要先从代码说起来了,把代码贴出来和Java的代码进行对比可能更加明确。



从代码看来,Rust中的trait和Java中的接口非常相似,都是用来定义一组行为。



运行代码:



use animal::{Zoo,Chicken,Dog};
fn main() {
// 实例化结构体,并放入了两个对象
let zoo = Zoo{
components: vec![
Box::new(Chicken{
name: String::from("xiao ji"),
}),
Box::new(Dog{
name: String::from("旺财"),
}),
],
};
zoo.run();
}



运行结果:

xiao ji is bark
旺财 is bark



1.2 泛型代码



上代码:



pub trait Animal{
fn bark(&self);
}
pub struct Dog{
pub name: String,
}
pub struct Chicken{
pub name: String,
}
impl Animal for Dog{
fn bark(&self){
println!("{} is bark",&self.name)
}
}
impl Animal for Chicken{
fn bark(&self){
println!("{} is bark",&self.name)
}
}
// 把特征换成泛型
pub struct Zoo<T: Animal>{
pub components: Vec<T>,
}
impl <T> Zoo<T> where T: Animal{
pub fn run(&self){
for c in self.components.iter() {
c.bark();
}
}
}



代码没有大的改变,将集合中使用trait改为泛型。



主代码不变,然后编译代码,出现如下错误



160 | pub struct Box<T: ?Sized>(Unique<T>);
| ------------------------------------- doesn't satisfy `std::boxed::Box<animal::Chicken>: animal::Animal`
|
= note: the method `run` exists but the following trait bounds were not satisfied:
`std::boxed::Box<animal::Chicken>: animal::Animal`



1.2 出现问题的原因?



Rust与Java不同, 在Java中,可能接口和泛型,都可以使用,代表一类类型,但是在Rust中,竟然不可以,这是为什么呢?



在Rust中, 由于安全性考虑,在使用泛型的时候,类型由第一个个对象确定了, 在编译的时候,发现后边的类型与第一个类型不同,则会出现这样的错误。



1.3 结论



在Rust中使用泛型和特征的时候要注意,可能特种更符合Java中的接口与泛型。而Rust泛型由于在编译的时候确定了类型,反而有些像数组,确定了唯一类型,只能放一种类型。



发布于: 2020 年 08 月 16 日 阅读数: 27
用户头像

编号94530

关注

你的每一个点赞我都当成了喜欢 2020.04.29 加入

公众号: 星球x 欢迎大家关注,谢谢!

评论

发布
暂无评论
Rust特征与泛型区别点