在Rust(0.5和/或trunk)中,如何创建可变对象的可变向量?

时间:2013-03-20 21:43:34

标签: object vector rust mutability

我有以下代码(作为一个简要示例):

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等之间的冲突等。 )

有人可以给我一个简单的例子,它只分配并返回空对象吗?从那里我应该能够填写数据。

1 个答案:

答案 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中所示。