动态大小类型(DST)和 Sized 特性

str (非 &str )就是一个 DST,我们不能在运行时得知 str 的大小。 &str 是一个指针类型,大小是已知的。

DST:拥有额外的元数据存储动态大小的信息。

每一个特性都是一个是个 DST,使用 Trait Object 必须是像 &dyn TraitBox<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--
}