我想将一个不可变的引用传递给一个函数,该函数将用递增值填充 Vec
(一个切片),然后再次遍历它们,并将其中一些值替换为零。(埃拉托斯特尼筛法)。
我认为向量应该是不可变的(向量的数据类型和大小不会改变),但向量的内容应该是可变的(整数的引用)。
这证明是一个困难的任务... 我已经阅读了关于可变性和借用的文章,并且我觉得我对此有一个可以的理解。我对在 C 中引用、解引用、指针等的工作原理也有一个粗略的了解,但我认为我在 Rust 的语法方面遇到了困难。
我是否从错误的角度考虑这个问题?在 Rust 中,创建一个(可能巨大的)Vec
的副本,操作它,并返回它,更符合惯用法吗?
这是我到目前为止的代码(无法编译,有很多错误):
#![feature(iterator_step_by)]
pub fn nth(n: usize) {
let size: usize = (2 as f64 * n as f64 * (n as f64).ln()) as usize;
// Set an upper bound for seiving.
let size_sqrt: usize = (size as f64).sqrt().ceil() as usize;
let nums: Vec<&mut usize> = Vec::with_capacity(size);
sieve(nums, &size, &size_sqrt);
}
fn sieve(nums: [&mut usize], size: &usize, size_sqrt: &usize) {
for i in 0..*size {
nums[i] = i;
}
for num in nums {
if num < 2 {
continue;
} else if num > *size_sqrt {
break;
}
for x in (num.pow(2)..size).step_by(*num) {
nums[x] = 0;
}
}
}