如何通过引用传递拥有的数组

时间:2014-04-08 03:43:45

标签: rust

我第一次玩铁锈,实施快速排序,而且我坚持引用动态大小的数组(我对固定大小的数组没有任何问题)。

我想要一个无限大小的整数数组来排序,我可以用以下内容创建:

let array = ~[1,2,3,4,3,2,1];

但是,我不知道如何通过引用将其传递给分区函数。

partition ( a : &mut ~[uint], p: uint, i: uint) {
     // partition a, in place
}

当我尝试重新排序a中的任何元素时,编译器会抱怨:

  

错误:无法分配给不可变的vec内容a[..]

2 个答案:

答案 0 :(得分:3)

你应该使用向量的可变借位而不是对向量的指针的可变借位,所以你应该摆脱分区函数类型中的~指针。例如:

fn partition(_: &mut [uint], _: uint, _: uint) { }

fn main() {
    let mut array = ~[1, 2, 3, 4, 3, 2, 1];
    partition(array, 0, 0);
}

请注意,array会自动作为可变借用指针传递。

如果you use a Vec instead,则需要明确创建切片:

fn partition(_: &mut [uint], _: uint, _: uint) { }

fn main() {
    let mut array = vec!(1, 2, 3, 4, 3, 2, 1);
    partition(array.as_mut_slice(), 0, 0);
}

两个代码片段都应该在最新的Rust(从小费)上编译。

答案 1 :(得分:3)

使用0.10时,语言正在对数组类型进行一些更改,因此事情有点混乱。 Vec<T>是Rust的动态大小的数组类型。

let vec = vec!(1u,2,3,4,3,2,1);

partition ( a : &mut Vec<uint>, p: uint, i: uint) {
     // partition a, in place
}

请注意,目前只能通过首先调用.as_slice()或.as_mut_slice()才能通过括号对Vec建立索引,因为相应的特征尚未实现。