将 Box<dyn Trait> 转换为实现该特征的特定结构

问题描述 投票:0回答:1

我想将

Box<dyn Trait>
转换为实现该特征的特定结构。我知道结构是什么,所以我可以使用不安全的操作。当我使用原始指针对其进行类型转换时,它会给出 SIGSEGV。

trait Help {}

struct Me {
    data: Vec<String>
}

impl Help for Me {}

fn main() {
    let me = Me { data: vec!["please".to_string(), "help".to_string()] };
    let me: Box<dyn Help> = Box::new(me);
    
    let inner = unsafe {
        *(me.as_ref() as *const dyn Help as *const &Me)
    };
    dbg!(&inner.data);
    assert_eq!(inner.data, vec!["hello", "world"]);
}

游乐场链接

我试图避免

Any
,因为生产逻辑没有它,我想查看内部状态进行测试。

pointers rust casting traits
1个回答
0
投票

正如我在评论中所说,我相信不要使用不安全的代码这样做是个好主意,但如果你真的想要,你的错误就是额外的

&

let inner = unsafe { &*(&*me as *const dyn Help as *const Me) };

我还删除了

as_ref()
,因为它有风险,推理可能会变成你不想要的东西,并在开头添加了
&
,因为它是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.