问题描述
我有一个名为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
)的结构(Line
,display
)实际上都是指令(Debug
,Add
,...)将实现特征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 (将#修改为@)