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

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

当尝试实现这些函数时,我不断遇到诸如“未解析的名称 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/

相关文章:

javascript:如何使用函数式编程比较两个对象数组?

javascript - 将 PHP 对象数组转换为 javascript 数组

c++ - STL vector 和 c++ : how to . 在没有默认构造函数的情况下调整大小?

matlab - 为向量中的数字分配等级

C++ vector 中的最小元素

rust ...为什么要将函数从 rs 文件导入到库中? - 未能解决 : use of undeclared type or module `client`

rust - 如果没有匹配项,在 Rust 中使用 "match"会发生什么?

Java ArrayList get() 方法不返回 Point 对象?

JavaScript .each 函数保存最后一个值

rust - 如何返回盒装迭代器,该盒装迭代器返回f64的盒装迭代器?