我第一次玩铁锈,实施快速排序,而且我坚持引用动态大小的数组(我对固定大小的数组没有任何问题)。
我想要一个无限大小的整数数组来排序,我可以用以下内容创建:
let array = ~[1,2,3,4,3,2,1];
但是,我不知道如何通过引用将其传递给分区函数。
partition ( a : &mut ~[uint], p: uint, i: uint) {
// partition a, in place
}
当我尝试重新排序a中的任何元素时,编译器会抱怨:
错误:无法分配给不可变的vec内容
a[..]
答案 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建立索引,因为相应的特征尚未实现。