Object 在Rust(0.5和/或trunk)中,如何创建可变对象的可变向量?
我有以下代码(作为简化示例): 在尝试实现这些函数时,我不断遇到错误,例如Object 在Rust(0.5和/或trunk)中,如何创建可变对象的可变向量?,object,vector,rust,mutability,Object,Vector,Rust,Mutability,我有以下代码(作为简化示例): 在尝试实现这些函数时,我不断遇到错误,例如“未解析的名称项列表”,以及指针/可变类型之间的冲突(&~mutvs~mut,等等) 有人能给我一个简单的例子,只分配和返回空对象吗?从那里我应该能够填写数据。我不确定您遇到了什么问题,但这里有一些提示。首先,我建议转移到Rust trunk—您使用的类语法表示Rust的一个相当旧的版本。在主干上,mut不再是所属类型内部的有效修饰符,这意味着不能写入~mut T,也不能写入struct{mut field:T}。相反,所
“未解析的名称项列表”
,以及指针/可变类型之间的冲突(&~mut
vs~mut
,等等)
有人能给我一个简单的例子,只分配和返回空对象吗?从那里我应该能够填写数据。我不确定您遇到了什么问题,但这里有一些提示。首先,我建议转移到Rust trunk—您使用的
类
语法表示Rust的一个相当旧的版本。在主干上,mut
不再是所属类型内部的有效修饰符,这意味着不能写入~mut T
,也不能写入struct{mut field:T}
。相反,所属类型的可变性是通过其在堆栈中的根继承的。因此,如果您有类型Foo=~[~str]
,那么当在let Foo=~[~“bar”]
中声明时,该类型是高度不可变的,当let mut Foo=~[~“bar”]
中声明时,该类型是高度可变的
下面是一个基于您的类型的示例
struct Item {
attributes: ~[~str]
}
struct ItemList {
items: ~[ ~Item ]
}
fn read_item() -> ~Item {
~Item {
attributes: ~[~"puppies"]
}
}
fn load_item_list() -> ~ItemList {
~ItemList {
items: ~[read_item()]
}
}
fn main() {
let mut my_items = load_item_list();
my_items.items[0].attributes[0] = ~"kitties";
}
您可以看到,这些类型根本没有提到可变性,但是因为我们将它们加载到一个可变的槽中(让mut my_items
),所以内部向量中的值可以进行变异
这可能需要一些时间来适应,但Rust以这种方式处理内部可变性,以避免一些与借用指针相关的潜在混淆错误
这种继承的可变性的例外是托管类型,它也可以是可变性的根,如
@mut T
谢谢!这更简单,更有意义。我确实注意到了D和Scala中容器与内容可变性之间的问题。很高兴在锈病中看到如此明智的解决方案。
struct Item {
attributes: ~[~str]
}
struct ItemList {
items: ~[ ~Item ]
}
fn read_item() -> ~Item {
~Item {
attributes: ~[~"puppies"]
}
}
fn load_item_list() -> ~ItemList {
~ItemList {
items: ~[read_item()]
}
}
fn main() {
let mut my_items = load_item_list();
my_items.items[0].attributes[0] = ~"kitties";
}