我有一个Vec<u8>
命名和一个名为typevec
的变量。我希望 的数据指针指向.x
&dyn Trait
x
vec
#[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 }"
}
我正在尝试开发像 JVM 这样的虚拟机。每个实现所需特征 ( or ) 的结构 ( 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, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({}, {})", 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, 1, 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
不同长度的 s 将与Vec<u8>
. 在这个例子中, my struct
s 的内存布局可能与我想象的不匹配,但这并不重要,因为它们的布局不需要在编译时知道,而只需要在运行时知道。将其Vec<u8>
视为程序从文件中读取的字节,而文件本身是由同一程序创建的。
即使它是不安全或未定义的行为并且不使用智能指针/堆分配,我该怎么做?