我想将
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
,因为生产逻辑没有它,我想查看内部状态进行测试。
正如我在评论中所说,我相信不要使用不安全的代码这样做是个好主意,但如果你真的想要,你的错误就是额外的
&
:
let inner = unsafe { &*(&*me as *const dyn Help as *const Me) };
我还删除了
as_ref()
,因为它有风险,推理可能会变成你不想要的东西,并在开头添加了&
,因为它是必需的。