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 协议》,转载必须注明作者和本文链接
令狐一冲
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
255
粉丝
120
喜欢
308
收藏
128
排名:335
访问:2.8 万
私信
所有博文
社区赞助商