Sized语法来标识dyn Shape可以是动态大小类型,从而允许为trait实现动态大小类型。 3. 使用方法 3.1 检查类型是否满足Sized Trait 在Rust中,我们可以使用is_sized函数来检查类型是否满足Sized Trait。 fn main() { println!("i32 is Sized: {}", std::mem::size_of::<i32>() == std::mem::size_of::<i3...
fn weird() where Self: Sized {} 此时,我们不再能通过一个&dyn Hello类型的变量来调用weird,因为它不在vtable里了,如果你这么做了,编译器会告诉你weird不能被trait object调用,因为它要求Self是Sized的,而显然,dyn不是Sized的。 同样的,如果trait Hello where Self: Sized,那么整个trait都不是object safe的。
Sized语法为trait实现动态大小类型implShapefordynShape + ?Sized{fnarea(&self)->f64{// 实现trait方法} }fnmain() {letcircle: Circle = Circle { radius:5.0};letshape: &dynShape = &circle; shape.area(); } 在上述正确示例中,我们使用了?Sized语法来标识dyn Shape可以是动态大小类型,从而允许为trait...
它们的规范是Box<dyn trait>(Rc<dyn trait>也可以),它也是runtime时候才能知道大小和分配,所以它也是一个动态大小类型。 rust提供了Sized这个trait,它可以用来trait bound泛型是否是动态大小。 实际上这个trait是会自动给所有可知大小类型实现的,并且隐式的把这个bound到每一个泛型中。
在trait对象中,存在一个隐藏的指针,用于存储具体类型的值,并通过该指针来调用具体类型的方法。因此,trait对象的大小是固定的,即&dyn Trait类型的大小等于一个指针的大小。 2.3 Sized Trait的限制 在Rust中,动态大小类型(DST)有一些限制,特别是在泛型和trait实现中。
dyn Traits 不会实现自动特征,除非它们在 (dyn Any + Sync,dyn Any + Unsized) 中明确选择它们。 原因是,如果我们考虑自身,自动特征几乎没有价值dyn Trait,因为它没有有关实际类型的信息。通常,我们想要的是底层类型实现自动特征,而不是其dyn Trait本身。Sync例如,考虑一下:我们无法判断它是否dyn Any是Sync,因...
由于动态大小类型的大小在编译时无法确定,所以它们存在一些限制。对于引用类型&T,被引用的类型T必须实现了Sizedtrait,即其大小必须是固定的。而对于trait对象&dyn Trait,traitTrait也必须是Sized的。 代码语言:javascript 复制 // 错误示例:引用类型的大小不能确定fnprocess_data(data:&[i32]){// 处理数据}fnmain(...
DST是Dynamic Sized Types,即动态大小类型,指的是“编译器静态无法获取该类型大小,只能在运行时动态获得”。在Rust里面,属于DST的有四类:[T]和str、特征对象、DST和外部类型。 切片[T]和str//str示例 let s1: str = "Hello there!"; //DST let s2: str = "How's it going?"; //DST //切片示例 ...
Rust中对于动态大小类型专门有一个名词Dynamic Sized Type。我们后面将会看 到的[T],str以及dyn Trait都是DST。 Sized trait是Rust中一个非常重要的trait,它的定义如下: #[lang = "sized"] #[rustc_on_unimplemented = "`{Self}` does not have a constant size known at compile-time"] #[fundamental] ...
(DOUBLE_WIDTH, size_of::<Box<dyn ToString>>()); // trait 对象 assert_eq!(DOUBLE_WIDTH, size_of::<&Unsized>()); // 自定义的未定大小类型 // 未定大小类型 size_of::<str>(); // 编译错误 size_of::<[i32]>(); // 编译错误 size_of::<dyn ToString>(); // 编译错误 size_of...