Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新包含Rust中多态实例的向量的元素_Rust_Polymorphism - Fatal编程技术网

更新包含Rust中多态实例的向量的元素

更新包含Rust中多态实例的向量的元素,rust,polymorphism,Rust,Polymorphism,我试图在Rust中使用多态性,但遇到了很大的困难。以下是我的基本结构: trait Constant { ... } struct ConstantString { ... } impl Constant for ConstantString { ... } struct ConstantClass { ... } impl Constant for ConstantClass { ... } // other Constant implementations struct JavaClass

我试图在Rust中使用多态性,但遇到了很大的困难。以下是我的基本结构:

trait Constant { ... }
struct ConstantString { ... }
impl Constant for ConstantString { ... }
struct ConstantClass { ... }
impl Constant for ConstantClass { ... }
// other Constant implementations

struct JavaClass
    constants: Vec<Box<dyn Constant>>
无效,因为我遇到了多个借用或不可变借用错误


但我是否使用了正确的方法?在内存管理方面,Rust的表现与其他语言非常不同。

经过进一步的尝试,下面是我的解决方法。首先,我去掉了
常量
特征,并为每个子类型创建了一个集合,例如

pub struct JavaClass {
    constants_class: HashMap<usize, ConstantClass>,
    constants_string: HashMap<usize, ConstantString>,
    constants_string_ref: HashMap<usize, ConstantStringRef>,
    constants_method: HashMap<usize, ConstantMethod>,
    constants_field: HashMap<usize, ConstantField>,
    constants_name_type: HashMap<usize, ConstantNameType>
}
pub-struct-JavaClass{
常量类:HashMap,
常量\u字符串:HashMap,
常量\u字符串\u ref:HashMap,
常量\u方法:HashMap,
常量\u字段:HashMap,
常量\名称\类型:HashMap
}

此外,通过在
JavaClass
构造函数中构建这些类,我能够避免任何可变错误。我发现,与属于
self

的集合相比,操作本地声明的集合更容易。我认为您要查找的是
std::any::any
。然而,这里发生了很多事情,我想知道这是否是解决生锈问题的最佳方法。你能再解释一下你要解决的更大的问题是什么吗?更大的问题是我要写一些解析Java字节码的代码。字节码包含一个可以相互引用的常量数组(例如,类常量包含字符串常量的索引号)。第一步是创建常量向量,第二步是解析常量之间的引用。希望这有道理。啊,我明白了。这里的部分问题是Rust不允许在存在对结构的不可变引用时移动结构,也不允许在不固定的情况下创建自引用结构。老实说,这里最好的方法可能是在堆上进行分配,并在
Rc
中使用引用计数,也可能只是使用哈希表。哈希表方法可能是最简单也是最好的。如果您不知道使用什么作为键,您可能只需要使用一个从0开始的计数器。至于向下转换,您可能需要一个枚举或
Any
,正如我前面提到的。就我个人而言,我会使用枚举,虽然每个枚举都有其优缺点(存储空间、存储位置、间接寻址等),但您的意思是使用单个结构,包含所有可能情况的所有必要字段,并使用枚举来区分彼此吗?
pub struct JavaClass {
    constants_class: HashMap<usize, ConstantClass>,
    constants_string: HashMap<usize, ConstantString>,
    constants_string_ref: HashMap<usize, ConstantStringRef>,
    constants_method: HashMap<usize, ConstantMethod>,
    constants_field: HashMap<usize, ConstantField>,
    constants_name_type: HashMap<usize, ConstantNameType>
}