共享篋:基于封装的动态调度实现

  在这一节里,列出基于指针类型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));
}

参考资料