【发布时间】:2018-02-28 20:07:24
【问题描述】:
我正在尝试将一个对Vec(切片)的不可变引用传递给一个函数,该函数将用递增的值填充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;
}
}
}
【问题讨论】:
-
是的,这是惯用的。也有没有的时候。
-
谢谢,至少我知道我在正确的轨道上。我也意识到我希望获得与我的问题相关的更多信息,因此我将修改问题
-
let mut v = vec![1, 2, 3]; v[0] = 42;(是的,我知道我似乎很迟钝,但我想看看我是否能在这里找出真正的潜在问题)。 -
我认为OP的重要问题是“我的想法是向量是不可变的(向量的数据类型和大小永远不会改变)但是向量的内容应该是对整数的可变引用。或者它们应该是整数本身的实际值(而不是引用)?” 我觉得你的第一行想法很奇怪,你的第二个选项(vec 包含整数)是我们大多数人会做什么。
标签: rust