共享篋:基于封装的动态调度实现
在这一节里,列出基于指针类型Box
封装的动态调度实现。
学习内容
- 了解和学习基于指针类型
Box
封装的动态函数实现方法
篇目
动态模块实现
// File: src/mod_dynamic_fn.rs use super::mod_trait::TraitCanal; pub fn get_dynamic_box(canal: Box<dyn TraitCanal>) -> (u32) { canal.get_tuple() } pub fn get_dynamic_box_trait_ref(canal: Box<&dyn TraitCanal>) -> (u32) { canal.get_tuple() } pub fn get_dynamic_box_ref(canal: &Box<dyn TraitCanal>) -> (u32) { canal.get_tuple() } pub fn get_dynamic_box_and_trait_ref(canal: &Box<&dyn TraitCanal>) -> (u32) { canal.get_tuple() }
动态模块应用
// File: examples/box_dynamic_hello.rs use mod_trait_exerci::mod_box_dynamic_fn; use mod_trait_exerci::mod_trait::StructType; use mod_trait_exerci::mod_trait::TraitCanal; use mod_trait_exerci::mod_trait::TupleType; // clear && cargo run --example box_dynamic_hello fn main() { let instance: StructType = Default::default(); let instance_box_trait: Box<dyn TraitCanal> = Box::new(instance); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_ref(&instance_box_trait)); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box(instance_box_trait)); let instance: StructType = Default::default(); let instance_box_trait: Box<&dyn TraitCanal> = Box::new(&instance); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_and_trait_ref(&instance_box_trait)); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_trait_ref(instance_box_trait)); let instance: TupleType = Default::default(); let instance_box_trait: Box<dyn TraitCanal> = Box::new(instance); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_ref(&instance_box_trait)); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box(instance_box_trait)); let instance: TupleType = Default::default(); let instance_box_trait: Box<&dyn TraitCanal> = Box::new(&instance); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_and_trait_ref(&instance_box_trait)); assert_eq!((0), mod_box_dynamic_fn::get_dynamic_box_trait_ref(instance_box_trait)); }