rust使用原始指针进行类型转换
admin
撰写于 2024年 07月 29 日

我们想将 dyn trait 转换成目标实现类型 T

Arc<RWLock<dyn Object>>  转换 Arc<RWLock<DbPool>>  

向下转型

正常情况下,我们先转换 as_any 获取 &dyn Any类型 然后才可以进行向下转型 downcast_ref::().unwrap()

fn as_any(&self) -> &dyn Any {
        self
    }

let mysql_pool : Arc<RWLock<dyn Object>> =  factory.get_object::<DbPool>("app1", object_id)
let db_pool = mysql_pool.as_any().downcast_ref::<DbPool>().unwrap();

原始指针转型

通过原始指针进行转换我们的目标类型,前提要判断下类型是否一致

原始指针可以直接转换,不用转换any类型,再向下转型,只需要判断类型一致,可以直接转换,简单,快速,注意是unsafe

不过我们判断类型一致就可以了

if type_id == TypeId::of::<T>() {
let value : Arc<RWLock<dyn Object>> =  factory.get_object::<DbPool>("app1", object_id)
// 将 object 转换为原始指针
let object = Arc::into_raw(value);
// 将原始指针转换为我们实际的实现目标类型
let object = unsafe { Arc::from_raw(object as *const RwLock<T>) };
return Some(object);
}

rust使用原始指针进行类型转换

我们想将 dyn trait 转换成目标实现类型 T

Arc<RWLock<dyn Object>>  转换 Arc<RWLock<DbPool>>  

向下转型

正常情况下,我们先转换 as_any 获取 &dyn Any类型 然后才可以进行向下转型 downcast_ref::().unwrap()

fn as_any(&self) -> &dyn Any {
        self
    }

let mysql_pool : Arc<RWLock<dyn Object>> =  factory.get_object::<DbPool>("app1", object_id)
let db_pool = mysql_pool.as_any().downcast_ref::<DbPool>().unwrap();

原始指针转型

通过原始指针进行转换我们的目标类型,前提要判断下类型是否一致

原始指针可以直接转换,不用转换any类型,再向下转型,只需要判断类型一致,可以直接转换,简单,快速,注意是unsafe

不过我们判断类型一致就可以了

if type_id == TypeId::of::<T>() {
let value : Arc<RWLock<dyn Object>> =  factory.get_object::<DbPool>("app1", object_id)
// 将 object 转换为原始指针
let object = Arc::into_raw(value);
// 将原始指针转换为我们实际的实现目标类型
let object = unsafe { Arc::from_raw(object as *const RwLock<T>) };
return Some(object);
}

赞 (0)

评论区(暂无评论)

啊哦,评论功能已关闭~