- tags: Rust
动态大小类型(DST)和 Sized
特性
str
(非 &str
)就是一个 DST,我们不能在运行时得知 str
的大小。 &str
是一个指针类型,大小是已知的。
DST:拥有额外的元数据存储动态大小的信息。
每一个特性都是一个是个 DST,使用 Trait Object 必须是像 &dyn Trait
和 Box<dyn Trait>
(或 Rc<dyn Trait>
)的指针类型。
dyn 关键字
dyn
关键字用于将 Trait Object 指针和普通的结构体指针区分开来。
Sized vs ?Sized
Rust 有一个特定的特性叫做 Sized
去判断一个类型的大小是否是编译期可知的,并且自动在编译期为所有已知大小的类型实现,
同时 Rust 隐式的为泛型函数的类型参数加上 Sized
的限制(bound),下面这样的泛型函数:
fn generic<T>(t: T) {
// --snip--
}
实际上相当于像下面这样硬编码:
fn generic<T: Sized>(t: T) {
// --snip--
}
也可以通过下面特定的语法取消这个限制:
fn geneic<T: ?Sized>(t: &T) {
// --snip--
}