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

Object 在Rust(0.5和/或trunk)中,如何创建可变对象的可变向量?,object,vector,rust,mutability,Object,Vector,Rust,Mutability,我有以下代码(作为简化示例): 在尝试实现这些函数时,我不断遇到错误,例如“未解析的名称项列表”,以及指针/可变类型之间的冲突(&~mutvs~mut,等等) 有人能给我一个简单的例子,只分配和返回空对象吗?从那里我应该能够填写数据。我不确定您遇到了什么问题,但这里有一些提示。首先,我建议转移到Rust trunk—您使用的类语法表示Rust的一个相当旧的版本。在主干上,mut不再是所属类型内部的有效修饰符,这意味着不能写入~mut T,也不能写入struct{mut field:T}。相反,所

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

在尝试实现这些函数时,我不断遇到错误,例如
“未解析的名称项列表”
,以及指针/可变类型之间的冲突(
&~mut
vs
~mut
,等等)


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

我不确定您遇到了什么问题,但这里有一些提示。首先,我建议转移到Rust trunk—您使用的
语法表示Rust的一个相当旧的版本。在主干上,
mut
不再是所属类型内部的有效修饰符,这意味着不能写入
~mut T
,也不能写入
struct{mut field:T}
。相反,所属类型的可变性是通过其在堆栈中的根继承的。因此,如果您有
类型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";
}
您可以看到,这些类型根本没有提到可变性,但是因为我们将它们加载到一个可变的槽中(
让mut my_items
),所以内部向量中的值可以进行变异

这可能需要一些时间来适应,但Rust以这种方式处理内部可变性,以避免一些与借用指针相关的潜在混淆错误


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

谢谢!这更简单,更有意义。我确实注意到了D和Scala中容器与内容可变性之间的问题。很高兴在锈病中看到如此明智的解决方案。
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";
}