如何更改动态调度/特征对象的数据指针?

问题描述

我有一个名为Vec<u8>的{​​{1}}和一个类型为vec的名为x的变量。我希望&dyn Trait的数据指针指向x中的位置。

vec

我正在尝试开发类似JVM的虚拟机。每个实现所需特征(#[derive(Debug)] struct Point { x: u8,y: u8,} fn main() { let vec: Vec<u8> = vec![35,1,51,10]; let x: &dyn Debug; // create a &dyn Debug with its data pointer // pointing to vec[2] while the vtable points // to Point's implementation of Debug println!("{:?}",x); // expected output: "Point { x: 51,y: 10 }" } Point)的结构(Linedisplay)实际上都是指令(DebugAdd ,...)将实现特征Mov,该特征包含指令本身的代码

这是另一个更接近我想做的例子:

Instruction

多个不同长度的use std::fmt::{self,display}; struct Point { pub x: u8,pub y: u8,} impl display for Point { fn fmt(&self,f: &mut fmt::Formatter) -> fmt::Result { write!(f,"({},{})",self.x,self.y) } } struct Line { pub start: Point,pub end: Point,} impl display for Line { fn fmt(&self,self.start,self.end) } } struct Data { vec: Vec<u8>,index: usize,} impl Data { fn new(vec: Vec<u8>) -> Self { Self { vec,index: 0 } } fn next(&mut self) -> Option<&dyn display> { let obj; self.index += 1; match self.vec[self.index] { 0 => { obj = Some(/* &Point { ... } with address equal to &(self.vec[self.index])*/); self.index += std::mem::size_of::<Point>(); } 1 => { obj = Some(/* &Line { ... } with address equal to &(self.vec[self.index])*/); self.index += std::mem::size_of::<Line>(); } _ => { obj = None; } } obj } } fn main() { let raw_vec: Vec<u8> = vec![0,24,53,65,103,68,10,2]; let data = Data::new(raw_vec); assert!(format!("{}",data.next().unwrap()) == "(24,53)".to_string()); assert!(format!("{}",data.next().unwrap()) == "((65,103),(68,10))".to_string()); } 将与struct共享它们的数据。在此示例中,我的Vec<u8>的内存布局可能与我想像的不匹配,但这无关紧要,因为不需要在编译时知道它们的布局,而仅在运行时才知道。将struct视为该程序从文件读取的字节,而文件本身是由同一程序创建的。

即使这是不安全或不确定的行为,并且不使用智能指针/堆分配,我该怎么办?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)