是否可以使用对数组的引用来创建数组(或任何其他内容)的切片,以指定开始/结束,而不是索引?

例如,假设我正在迭代一个数组,当我到达某个元素时,我想调用一个函数,将数组的一部分从当前元素传递到最后:

let list = [1, 2, 3, 4, 5, 6];
for item in &list {
   if passes_test(item) {
       process_remainder(&list[item..]); // does not compile
   }
}

对于C语言来说,这似乎是一件很自然的事情——引用只是一个指针,切片只是一对指针(或指针和长度),获取多个引用应该是可以的,因为它们都不是可变的.但我找不到正确的语法来做.

或者,是否可以获取给定引用的索引(如C中的指针算法),或者我只需要分解并使用enumerate在迭代时生成索引和引用?

推荐答案

你可以做到,但既不安全也不美观:

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是更好的 Select :

let list = [1, 2, 3, 4, 5, 6];
for (i, item) in list.iter().enumerate() {
   if passes_test(item) {
       process_remainder(&list[i..]);
   }
}

Rust相关问答推荐

Rust kill std::processs::child

如何使用字符串迭代器执行查找?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

如何在递归数据 struct 中移动所有权时变异引用?

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

铁 rust ,我的模块介绍突然遇到了一个问题

如何在嵌套的泛型 struct 中调用泛型方法?

Rust 中的静态引用

Option<&T> 如何实现复制

相当于 Rust 中 C++ 的 std::istringstream

一旦令牌作为文字使用,声明宏不匹配硬编码值?

Rust 中 Mutex<> 的深拷贝?

从嵌入式 Rust 中的某个时刻开始经过的时间

在 Rust 中如何将值推送到枚举 struct 内的 vec?

使用 HashMap 条目时如何避免字符串键的短暂克隆?

如何解析 Rust 中的 yaml 条件字段?

预期类型参数,发现不透明类型

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

令人困惑的错误消息? (解包运算符)