Rust:从引用创建切片
Rust: Creating a slice from a reference
是否可以使用对该数组的引用来指定 start/end 而不是索引来创建数组的切片(或其他任何内容)?
例如,假设我正在遍历一个数组,当我到达某个元素时,我想调用一个函数,将数组的一部分从当前元素传递到末尾:
let list = [1, 2, 3, 4, 5, 6];
for item in &list {
if passes_test(item) {
process_remainder(&list[item..]); // does not compile
}
}
来自 C 语言,这似乎是一件自然而然的事情 - 引用只是一个指针,而切片只是一对指针(或指针和长度),并且采用多个引用应该没问题,因为none 其中是可变的。但是我找不到正确的语法来做到这一点。
或者,是否可以获取给定引用的索引(如 C 中的指针算法),或者我是否只需要分解并在迭代时使用枚举生成索引和引用?
通常,enumerate
优于指针算法。
fn main() {
let list = [1i32, 2, 3, 4, 5, 6];
for (index, item) in list.iter().enumerate() {
if *item > 5 {
process_remainder(&list[index..]);
}
}
}
(一不小心,你的代码 会 编译,因为数组项是 usize
。:) 所以我将它们更改为 i32
。)
你可以做到,但它既不安全也不漂亮:
let list = [1, 2, 3, 4, 5, 6];
for item in &list {
if passes_test(item) {
let idx = unsafe { (item as *const u64).offset_from(list.as_ptr()) as usize };
process_remainder(&list[idx..]);
}
}
使用 enumerate
是更好的选择:
let list = [1, 2, 3, 4, 5, 6];
for (i, item) in list.iter().enumerate() {
if passes_test(item) {
process_remainder(&list[i..]);
}
}
是否可以使用对该数组的引用来指定 start/end 而不是索引来创建数组的切片(或其他任何内容)?
例如,假设我正在遍历一个数组,当我到达某个元素时,我想调用一个函数,将数组的一部分从当前元素传递到末尾:
let list = [1, 2, 3, 4, 5, 6];
for item in &list {
if passes_test(item) {
process_remainder(&list[item..]); // does not compile
}
}
来自 C 语言,这似乎是一件自然而然的事情 - 引用只是一个指针,而切片只是一对指针(或指针和长度),并且采用多个引用应该没问题,因为none 其中是可变的。但是我找不到正确的语法来做到这一点。
或者,是否可以获取给定引用的索引(如 C 中的指针算法),或者我是否只需要分解并在迭代时使用枚举生成索引和引用?
通常,enumerate
优于指针算法。
fn main() {
let list = [1i32, 2, 3, 4, 5, 6];
for (index, item) in list.iter().enumerate() {
if *item > 5 {
process_remainder(&list[index..]);
}
}
}
(一不小心,你的代码 会 编译,因为数组项是 usize
。:) 所以我将它们更改为 i32
。)
你可以做到,但它既不安全也不漂亮:
let list = [1, 2, 3, 4, 5, 6];
for item in &list {
if passes_test(item) {
let idx = unsafe { (item as *const u64).offset_from(list.as_ptr()) as usize };
process_remainder(&list[idx..]);
}
}
使用 enumerate
是更好的选择:
let list = [1, 2, 3, 4, 5, 6];
for (i, item) in list.iter().enumerate() {
if passes_test(item) {
process_remainder(&list[i..]);
}
}