Rust 如何更改动态分派/trait对象的数据指针?

Rust 如何更改动态分派/trait对象的数据指针?,rust,dynamic-dispatch,trait-objects,shared-data,Rust,Dynamic Dispatch,Trait Objects,Shared Data,我有一个名为Vec的Vec和一个名为x的变量,类型为&dyn Trait。我希望x的数据指针指向vec中的一个位置 #[派生(调试)] 结构点{ x:u8, y:u8, } fn main(){ 让vec:vec=vec![35,1,51,10]; 设x:&dyn调试; //使用数据指针创建dyn调试(&D) //指向vec[2],而vtable指向 //到点调试的实现 println!(“{:?}”,x);//预期输出:“点{x:51,y:10}” } 我正在尝试开发一个类似JVM的虚拟机。

我有一个名为
Vec
Vec
和一个名为
x
的变量,类型为
&dyn Trait
。我希望
x
的数据指针指向
vec
中的一个位置

#[派生(调试)]
结构点{
x:u8,
y:u8,
}
fn main(){
让vec:vec=vec![35,1,51,10];
设x:&dyn调试;
//使用数据指针创建dyn调试(&D)
//指向vec[2],而vtable指向
//到点调试的实现
println!(“{:?}”,x);//预期输出:“点{x:51,y:10}”
}
我正在尝试开发一个类似JVM的虚拟机。实现所需特征(
显示
调试
)的每个结构(
)实际上将是一条指令(
添加
移动
,…),它将实现特征
指令
,该特征包含指令本身的代码

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

使用std::fmt::{self,Display};
结构点{
酒吧x:u8,
酒吧y:u8,
}
点的impl显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“({},{})”,self.x,self.y)
}
}
结构线{
酒吧开始:点,
酒吧结束:点,
}
行的impl显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“({},{})”,self.start,self.end)
}
}
结构数据{
维克:维克,
索引:usize,
}
impl数据{
fn新(vec:vec)->自我{
Self{vec,索引:0}
}
fn下一步(&mut self)->选项{
让obj;
自指数+=1;
匹配self.vec[self.index]{
0 => {
obj=地址等于&(self.vec[self.index])*/的一些(/*&点{…});
self.index+=std::mem::size_of::();
}
1 => {
obj=地址等于&(self.vec[self.index])*/的一些(/*&行{…});
self.index+=std::mem::size_of::();
}
_ => {
obj=无;
}
}
obj
}
}
fn main(){
让raw_vec:vec=vec![0,24,53,1,65,103,68,10,2];
让data=data::new(原始向量);
断言!(格式!(“{}”,data.next().unwrap())==“(24,53)”.to_string());
断言!(格式!(“{}”,data.next().unwrap())==“((65,103)、(68,10))”。to_string());
}
多个不同长度的
struct
s将与
Vec
共享其数据。在本例中,我的
struct
s的内存布局可能与我假设的不匹配,但这并不重要,因为它们的布局不需要在编译时知道,而只需要在运行时知道。可以将
Vec
看作是程序从文件中读取的字节,而文件本身是由同一程序创建的


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

看起来您的问题可能会由的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将这个问题标记为已回答。“即使是不安全或未定义的行为,我怎么做?”--你的意思是,你怎么能让这个有时有效,有时无效,有时只是提供随机数据,有时会在程序的不相关部分导致意外错误?也可以假设我确实知道
点的数据布局
-根据此代码,您不知道
repr(Rust)
对布局没有任何保证。