Rust 编程视频教程(进阶)——027_3 高级特性 3
视频地址
头条地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/
源码地址
github地址:https://github.com/anonymousGiga/learn_rus...
讲解内容
动态大小类型(dynamically sized types),有时被称为 “DST” 或 “unsized types”,这些类型允许我们处理只有在运行时才知道大小的类型。
(1)str 是一个 DST;直到运行时我们都不知道字符串有多长。
例子://如下代码是错误的
let s1: str = "Hello there!";
let s2: str = "How's it going?";
正确代码为:
let s1: &str = "Hello there!";
let s2: &str = "How's it going?";
说明:
&str 则是 两个 值:str 的地址和其长度。这样,&str 就有了一个在编译时可以知道的大小:它是 usize 长度的两倍。也就是说,无论字符串是多大,&str的大小我们总是知道的。
因此,引出动态大小类型的黄金规则:必须将动态大小类型的值置于某种指针之后。如:Box 或 Rc、&str等。
另一个动态大小类型是trait。每一个 trait 都是一个可以通过 trait 名称来引用的动态大小类型。为了将 trait 用于 trait 对象,必须将他们放入指针之后,比如 &Trait 或 Box(Rc 也可以)。
(2) Sized trait
为了处理 DST,Rust 用Sized trait 来决定一个类型的大小是否在编译时可知。这个 trait 自动为编译器在编译时就知道大小的类型实现。
例子:
fn generic<T>(t: T) {//T为编译时就知道大小的类型
// --snip--
}
等价于
fn generic<T: Sized>(t: T) {//T为编译时就知道大小的类型
// --snip--
}
如何放宽这个限制呢?Rust提供如下方式:
fn generic<T: ?Sized>(t: &T) {//T 可能是Sized,也可能不是 Sized 的
// --snip--
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: