2

我有以下代码(作为简化示例):

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 {
}

在尝试实现这些功能时,我不断遇到诸如指针/可变性类型( vs等)"unresolved name ItemList"之间的错误和冲突&~mut~mut

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

4

1 回答 1

2

我不确定您遇到了什么问题,但这里有一些建议。首先,我建议转移到 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 以这种方式处理内部可变性,以避免一些与借用指针相关的潜在混淆错误。

这种继承的可变性的例外是托管类型,它也可以是可变性的根源,如@mut T.

于 2013-03-24T00:13:08.360 回答