首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rust中,为什么'[T]‘和'str’切片类型不是语法错误?

在Rust中,为什么'[T]‘和'str’切片类型不是语法错误?
EN

Stack Overflow用户
提问于 2021-04-16 13:00:57
回答 2查看 93关注 0票数 0

据我所知,&[T]类型是一个“fat”指针(内存地址和大小),而不是切片本身,而[T]是被引用的实际切片。但是为什么他们不让[T]在下面的上下文中成为一个语法错误呢?

代码语言:javascript
复制
let y: [i32; 6] = [1, 2, 3, 4, 5, 6];

// let z: [i32] = y[..]; // error: the size for values of type `[i32]` cannot be known at compilation time

let z: &[i32] = &y[..]; // OK

// let v: str = "Hello World"; // the size for values of type `str` cannot be known at compilation time

从错误:[i32] cannot be known at compilation,这仅仅是一个错误,让我的用户,理解为什么这个语法是不可能的,还是因为我没有正确使用这个语法,而且它在某些上下文中是有效的?

编辑:固定排版

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-16 13:04:46

因为可以在某些上下文中使用不大小的类型,如str[T]dyn MyTrait

目前最常见的是仿制药。例如,您可以拥有一个Box<[T]>Box<str>Arc<[T]>或任何与?Sized绑定的泛型。

还有一些正在开发中的特性使用这样的非大小类型:

  • 不过,使用一个不大小的字段,使结构本身变小。目前还很没用,因为您实际上无法创建这样的结构。
  • 当实现RFC-1909时,将允许您在堆栈上使用不大小的类型,在args中使用这些类型,方法是在堆栈上动态分配它们。不过,我不会指望它很快就会发生。
票数 5
EN

Stack Overflow用户

发布于 2021-04-16 13:20:05

但是为什么他们不让T在下面的上下文中成为一个语法错误呢?

因为语法没有任何理由无效吗?

虽然DSTs很难使用,并不是所有地方都有意义,但在某些情况下,它们是完全合法的。

代码语言:javascript
复制
struct Foo {
    a: usize,
    b: [i32]
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67125730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档