- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将对 Vec
(一个切片)的不可变引用传递给一个函数,该函数将用递增的值填充 Vec
,然后再次迭代它们用零替换其中一些值。 (Eratosthenes 的筛法)。
我认为向量应该是不可变的(向量的数据类型和大小不会改变)但向量的内容应该是可变的(对整数的引用。)
这已被证明是一项艰巨的任务。我已经阅读了有关可变性和借用的内容,并且我觉得我对此有很好的理解。我也粗略地了解了 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;
}
}
}
最佳答案
My thinking is that the vector is immutable (the data types and size of the vector will never change) but the contents of the vector should be mutable references to integers. Or should they be the actual values of the integers themselves (and not references)?
引用(&'a T
和 &'a mut T
)只能引用另一个值拥有的值。引用不能拥有它们的引用对象。
如果您希望有一个函数对集合中不一定连续的某些整数进行操作,那么构建一个整数引用向量可能是个好主意。但是,根据您的代码示例,情况似乎并非如此;向量拥有整数会更简单、更容易。这意味着向量本身需要是可变的。但是,如果您想确保函数不会尝试更改向量的大小,该函数可以接受一个可变的整数切片 &mut [usize]
,而不是对向量的可变引用 ( &mut Vec<usize>
)。
In Rust, is it more idiomatic to create a copy of a potentially huge
Vec
, operate on that, and return it?
这取决于你是否需要使用原来的Vec
之后再次。如果你不这样做,那么改变 Vec
会更有效。到位。如果只需要保留原来的Vec
在某些情况下而不是在其他情况下,您总是可以 clone()
Vec
预先。如果您确实需要原件 Vec
每次,那么返回一个新的 Vec
可能更有效率,特别是如果您可以使用 collect
从迭代器填充它,因为这将尝试提前分配正确的大小,并且只分配 Vec
中的每个值。一次。
考虑到所有这些,下面是我将如何编写您的代码。请注意,我必须更改 sieve
中的主循环不直接遍历 nums
,因为这会导致借用冲突——for
循环需要借用 nums
, 但赋值 nums[x]
也会尝试在 nums
上进行可变借用而另一个借用是活跃的。我还更改了 &usize
参数到 usize
,因为对小的、可复制的类型(例如原始整数)使用引用没有任何好处(事实上,它可能会稍微慢一些)。
#![feature(iterator_step_by)]
pub fn nth(n: usize) {
let size: usize = (2.0 * 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 mut nums: Vec<usize> = vec![0; size];
sieve(&mut nums, size, size_sqrt);
}
fn sieve(nums: &mut [usize], size: usize, size_sqrt: usize) {
for i in 0..size {
nums[i] = i;
}
for i in 0..size {
let num = nums[i];
if num < 2 {
continue;
}
if num > size_sqrt {
break;
}
for x in (num.pow(2)..size).step_by(num) {
nums[x] = 0;
}
}
}
关于rust - 如何在 Rust 中就地修改向量的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49037703/
编辑备注 由于 Rust(版本:1.42)仍然没有稳定的 ABI ,推荐使用extern (目前相当于extern "C"(将来可能会改变))否则,可能需要重新编译库。 This article解释如
词法分析器/解析器文件位于 here非常大,我不确定它是否适合只检索 Rust 函数列表。也许我自己编写/使用另一个库是更好的选择? 最终目标是创建一种执行管理器。为了上下文化,它将能够读取包装在函数
我试图在 Rust 中展平 Enum 的向量,但我遇到了一些问题: enum Foo { A(i32), B(i32, i32), } fn main() { let vf =
我正在 64 位模式下运行的 Raspberry Pi 3 上使用 Rust 进行裸机编程。我已经实现了一个自旋锁,如下所示: use core::{sync::atomic::{AtomicBool
我无法理解以下示例是如何从 this code 中提炼出来的, 编译: trait A: B {} trait B {} impl B for T where T: A {} struct Foo;
在我写了一些代码和阅读了一些文章之后,我对 Rust 中的移动语义有点困惑,我认为值移动后,它应该被释放,内存应该是无效的。所以我尝试写一些代码来作证。 第一个例子 #[derive(Debug)]
https://doc.rust-lang.org/reference/types/closure.html#capture-modes struct SetVec { set: HashSe
考虑 const-generic 数据结构的经典示例:方矩阵。 struct Matrix { inner: [[T; N]; N] } 我想返回一个结构体,其 const 参数是动态定义的:
以下代码无法编译,因为 x在移动之后使用(因为 x 具有类型 &mut u8 ,它没有实现 Copy 特性) fn main() { let mut a: u8 = 1; let x:
我在玩 Rust,发现了下面的例子: fn main() { let mut x = [3, 4, 5].to_vec(); x; println!("{:?}", x); }
假设一个 Rust 2018 宏定义了一个 async里面的功能。它将使用的语法与 Rust 2015 不兼容。因此,如果您使用 2015 版编译您的 crate,那么宏中的扩展代码不会与它冲突吗?
假设我有一些 Foo 的自定义集合s: struct Bar {} struct Foo { bar: Bar } struct SubList { contents: Vec, }
代码如下: fn inner(x:&'a i32, _y:&'b i32) -> &'b i32 { x } fn main() { let a = 1; { let b
在lifetime_things的定义中,'b的生命周期比'a长,但实际上当我调用这个函数时,x1比y1长,但是这样可以编译成功: //here you could see 'b:'a means
我正在尝试检索 FLTK-RS Widget 周围的 Arc Mutex 包装器的内部值: pub struct ArcWidget(Arc>); impl ArcWidget{ pub
如下代码所示,我想封装一个定时函数,返回一个闭包的结果和执行时间。 use tap::prelude::Pipe; use std::time::{Instant, Duration}; pub fn
我想实现自己的通用容器,这是我正在使用的特征的片段: pub trait MyVec where Self: Default + Clone + IntoIterator, Self:
所需代码: 注释掉的块可以编译并工作,但是我想从嵌套的匹配样式转变为更简洁的函数链 async fn ws_req_resp(msg: String, conn: PgConn) -> Result>
我正在尝试编写一些代码,该代码将生成具有随机值的随机结构。对于结构,我具有以下特征和帮助程序宏: use rand::{thread_rng, Rng}; use std::fmt; pub trai
我有一个带有函数成员的结构: struct Foo { fun: Box, } type FooI = Foo; 这不起作用: error[E0106]: missing lifetime s
我是一名优秀的程序员,十分优秀!