0

我有一个Vec<u8>命名和一个名为typevec的变量。我希望 的数据指针指向.x&dyn Traitxvec

#[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, )实际上都是一条指令 ( , , ...) 将实现该特征,该特征包含指令本身的代码。LineDisplayDebugAddMovInstruction

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

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 structs 的内存布局可能与我想象的不匹配,但这并不重要,因为它们的布局不需要在编译时知道,而只需要在运行时知道。将其Vec<u8>视为程序从文件中读取的字节,而文件本身是由同一程序创建的。

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

4

0 回答 0