zoukankan      html  css  js  c++  java
  • 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泛型由于在编译的时候确定了类型,反而有些像数组,确定了唯一类型,只能放一种类型。

  • 相关阅读:
    WebService及WCF获取客户端IP,端口
    单链表创建,删除节点,获取元素(与线性表比较)
    c语言描述简单的线性表,获取元素,删除元素,
    解决wamp mysql数据库出现乱码的问题。
    c语言将2进制数转化为10进制数(栈的初始化,进栈,出栈)
    c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
    css各兼容应该注意的问题
    C++需要注意的地方和小算法
    php最简单的文件处理。
    C++ 一目了然虚基类!
  • 原文地址:https://www.cnblogs.com/lifacheng/p/13512399.html
Copyright © 2011-2022 走看看