我有以下代码(作为一个简要示例):
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 {
}
尝试实现这些功能时,我一直遇到 "unresolved name ItemList"
等错误以及指针/可变性类型(&~mut
vs ~mut
等之间的冲突等。 )
有人可以给我一个简单的例子,它只分配并返回空对象吗?从那里我应该能够填写数据。
答案 0 :(得分:2)
我不确定你遇到了什么问题,但这里有一些指示。首先,我建议移动到Rust trunk - 您正在使用的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以这种方式处理内部可变性,以避免一些与借用指针相关的潜在混淆错误。
此继承可变性的例外是托管类型,它也可以是可变性的根,如@mut T
中所示。