共享篋:简单三层结构实现

  在前面学习概念基础之上,在这一节里,将会实现共享篋的简单三层结构。

学习内容

  • 理解和掌握知识模块的实现

篇目

静态函数的知识模块实现

  下面模块mod_static_fn代码,利用衔接特质TraitCanal,实现了两个不同功能的静态函数:get_static_type_ref()print_static_all_daten()

  关于函数get_static_type_ref(),输入实例是类型StructType或者TupleType的指针,输出是类型tuple,其元素值是它们属性data值。

  关于函数print_static_all_daten(),输入实例是StructType或者TupleType数组的指针,程序接受输入实例以后,打印输入实例及其属性内容。

  为了使用函数print_static_all_daten()里的打印宏,程序里需要做到两点:

  • 使用语句:use std::fmt::Debug;;
  • 函数参数里增加该特质Debug;

但是第一条语句应该不需要,因为类型StructTypeTupleType已经声明过了特质Debug。如特质PartialEq就没有使用use语句,这是因为类型StructTypeTupleType也已经声明过了PartialEq。但是有一点是肯定的:先要声明特质,然后还要在静态函数里使用它们,才能真正实现使用这些特质。

// File: src/mod_static_fn.rs
use super::mod_trait::TraitCanal;
use std::fmt::Debug;
use std::cmp::PartialEq;

//get_static_type_ref<T>
//get_static_trait_ref::<StructType>
//get_static_trait_ref::<TupleType>

// get_static_type_ref<Type: TraitCanal>(typ: &Type) -> (u32)
//get_static_trait_ref(typ: &StructType) -> (u32)
//get_static_trait_ref(typ: &TupleType) -> (u32)

// static: Generics type parameters
// dynamic: trait objects

pub fn get_static_type_ref<Type: TraitCanal>(typ: &Type) -> (u32) {
    (typ.get_tuple())
}

pub fn print_static_all_daten<Type: TraitCanal+Debug+PartialEq>(typs: &[Type]) {
    for typ in typs {
        let data = typ.get_tuple();
        println!("{:?}", typ);          // FOR Debug
        println!("{:?}", data);         // FOR Debug
        assert_eq!(*typ, typ.get_object());   // FOR PartialEq
    }
}

动态函数的知识模块实现

  下面模块mod_dynamic_fn代码的函数,与前面的说明完全类似。

// File: src/mod_dynamic_fn.rs
use super::mod_trait::TraitCanal;

pub fn get_dynamic_trait_ref(canal: &dyn TraitCanal) -> (u32) {
    (canal.get_tuple())
}

应用实例

  

// File: examples/trait_fn_hello.rs
// clear && cargo run --example trait_fn_hello
use mod_trait_exerci::mod_static_fn;
use mod_trait_exerci::mod_dynamic_fn;
use mod_trait_exerci::mod_trait;
use mod_trait::StructType;
use mod_trait::TupleType;

fn get_data_from_struct(instance: &StructType) {
    let data = mod_static_fn::get_static_type_ref(instance);
    assert_eq!(0, data);
    assert_eq!((0), data);
    let data = mod_dynamic_fn::get_dynamic_trait_ref(instance);
    assert_eq!(0, data);
    assert_eq!((0), data);
}

fn get_data_from_tuple(instance: &TupleType) {
    let data = mod_static_fn::get_static_type_ref(instance);
    assert_eq!(0, data);
    assert_eq!((0), data);
    let data = mod_dynamic_fn::get_dynamic_trait_ref(instance);
    assert_eq!(0, data);
    assert_eq!((0), data);
}

// clear && cargo run --example trait_fn_hello
fn main() {
    let instance: StructType = Default::default();
    get_data_from_struct(&instance);

    let instance: TupleType = Default::default();
    get_data_from_tuple(&instance);

    let instance: TupleType = Default::default();
    let instances = vec![instance, TupleType::new(100)];
    mod_static_fn::print_static_all_daten(&instances);    
}

参考资料