以下代码进行编译:

fn main() {
    let slices:&[i32] = &[1,2,3];
    let subSlice = &slices[1..3];
    print!("{:?}\n",subSlice);
}

但这失败了:

fn main() {
    let slices:&[i32] = &[1,2,3];
    let subSlice = slices[1..3];
    print!("{:?}\n",subSlice);
}
Compiling playground v0.0.1 (/playground)
error[E0277]: the size for values of type `[i32]` cannot be known at compilation time
--> src/main.rs:3:9
 |
3 |     let subSlice = slices[1..3];
  |         ^^^^^^^^ doesn't have a size known at compile-time

slices已经是用&创建的切片/引用(&[i32]).为什么我必须在&slices[1..3]中再次使用&

推荐答案

从语言的Angular 来看,对片的索引访问是根据Index<Idx>特性实现的.

这一特征被定义为:

pub trait Index<Idx> where
    Idx: ?Sized,{
    type Output: ?Sized;

    // Required method
    fn index(&self, index: Idx) -> &Self::Output;
}

Now it looks like using this should return a reference to the indexed element.
In fact, if we call this directly:

use std::ops::Index;

fn main() {
    let slices:&[i32] = &[1,2,3];
    //let subSlice = slices[1..3];
    let sub_slice: &[i32] = slices.index(1..3);
    print!("{:?}\n", sub_slice);
}

返回的类型确实是&[i32].(playground link)

然而,Index documentation page告诉我们以下几点:

CONTAINER[index]实际上是*tainer.index(Index)的语法糖

这意味着,在您的情况下,返回的切片将自动取消引用为[i32],这是未调整大小的.因此,你需要手动borrow 才能获得&[i32]分.

Rust相关问答推荐

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

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

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

如何go 除铁 rust 中路径组件的第一项和最后一项?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

为什么Deref类特征不构成?

在Rust中克隆源自INTO_ITER()的迭代器的成本?

如何使用reqwest进行异步请求?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

如何获取光标下的像素 colored颜色 ?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

Rust Redis 中的 HSET 命令问题

如何将 Rust 字符串转换为 i8(c_char) 数组?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

如何获得对数组子集的工作可变引用?

实现不消费的迭代器

为什么-x试图解析为文字并在声明性宏中失败?

相互调用的递归异步函数:检测到循环

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?