lef*_*ead 2 syntax traits type-bounds rust
如果我有这个代码:
trait Trait {
fn f(&self) -> i32 where Self: Sized;
fn g(&self) -> i32;
}
fn object_safety_dynamic(x: &Trait) {
x.f(); // error
x.g(); // works
}
Run Code Online (Sandbox Code Playgroud)
该条款实际上有什么where作用?
天真地,我在想where Self: Sized;关于类型实现的一些规定Trait,比如“如果你实现Trait类型,A你的类型A必须调整大小,即,它可以i32但不能[i32]”。
然而,这样的约束宁愿作为trait Trait: Sized(如果我错了请纠正我)?
现在我注意到where Self: Sized;实际上决定了我是否可以从内部调用f或。gobject_safety_dynamic
我的问题:
幕后发生了什么?
我实际上是在告诉编译器什么(用简单的英语)where Self: Sized;使g()工作有效但f()无效?
特别是:由于无论如何都是一个参考,因此各种(大小或未大小)类型之间&self存在编译差异。无论类型是否调整大小,它是否总是会归结为类似的东西?fg_vtable_f_or_g(*self) -> i32where
u8为什么我可以为和实现 Trait [u8]。难道编译器实际上不应该阻止我实现f()for [u8],而不是在调用站点抛出错误吗?
fn f(&self) -> i32 where Self: Sized;
这表示f仅为也实现Sized. 未调整大小的类型可能仍会实现Trait,但f将不可用。
在 内部object_safety_dynamic,调用x.f()实际上是在做:(*x).f()。虽然它x的大小是因为它是一个指针,*x但可能不是因为它可以是Trait. 但是函数内部的代码必须适用于任何有效的参数,因此不允许您x.f()在那里调用。