共享篋:简单三层结构实现
在前面学习概念基础之上,在这一节里,将会实现共享篋的简单三层结构。
学习内容
- 理解和掌握知识模块的实现
篇目
静态函数的知识模块实现
下面模块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
;
但是第一条语句应该不需要,因为类型StructType
和TupleType
已经声明过了特质Debug
。如特质PartialEq
就没有使用use
语句,这是因为类型StructType
和TupleType
也已经声明过了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); }