我有以下代码(作为简化示例):
class Item {
attributes: ~mut [~str];
}
class ItemList {
items: ~mut [ ~Item ];
}
fn read_item(rdr : Reader) -> ~mut Item {
}
fn load_item_list(rdr : Reader) -> ~mut ItemList {
}
当尝试实现这些函数时,我不断遇到诸如“未解析的名称 ItemList”
之类的错误以及指针/可变类型之间的冲突(&~mut
与 ~mut
等)
有人能给我一个简化的例子,它只分配并返回空对象吗?从那里我应该能够填写数据。
最佳答案
我不确定您遇到了什么问题,但这里有一些提示。首先,我建议转移到 Rust 主干 - class
您使用的语法表明 Rust 版本相当旧。在后备箱上,mut
不再是拥有类型内部的有效修饰符,这意味着 ~mut T
不能写,也不能 struct { mut field: T }
。相反,拥有类型的可变性是通过其在堆栈中的根继承的。所以如果你有 type 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";
}
您可以看到这些类型根本没有提到可变性,但是因为我们将它们加载到可变槽( let mut my_items
)中,所以内部向量中的值可以发生变化。
这可能需要一些时间来适应,但 Rust 以这种方式处理内部可变性,以避免一些与借用指针相关的潜在混淆错误。
这种继承的可变性的异常(exception)是托管类型,它也可能是可变性的根源,如 @mut T
所示。 .
关于object - 在 Rust(0.5 和/或 trunk)中,如何创建可变对象的可变向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535343/