我有以下代码:
trait Bar {
fn baz(&self, arg: impl AsRef<str>)
where
Self: Sized;
}
struct Foo;
impl Bar for Foo {
fn baz(&self, arg: impl AsRef<str>) {}
}
fn main() {
let boxed: Box<dyn Bar> = Box::new(Foo);
boxed.baz();
}
这会导致以下错误:
error: the `baz` method cannot be invoked on a trait object
--> src/main.rs:15:11
|
15 | boxed.baz();
| ^^^
为什么不可能呢?当我移除
Self: Sized
限制时,它可以工作,但是这样就无法使用泛型,而泛型使函数对调用者更加舒适。这不是为什么需要trait对象大小的通用方法需要trait对象大小?的重复问题,该问题询问为什么不能从trait对象调用
baz
。我不是在问为什么需要该限制;这已经被讨论过了。
: Sized
限制。不,我并没有问为什么需要这个限制。 - Tim Diekmann: Sized
约束会使 trait 不具备对象安全性。你基本上是再次回答了链接的问题。 - Tim Diekmannwhere Self: Sized
的限制,然后必须从该方法中删除所有泛型。在这里,泛型是impl AsRef<str>
,它有点像一个秘密的类型参数。在这里,您可以简单地将其替换为&str
。 - Phoenix