我正在努力解决对象安全的基础知识。如果我有这个代码
struct S {
x: i32,
}
trait Trait: Sized {
fn f(&self) -> i32
where
Self: Sized;
}
fn object_safety_dynamic(x: Trait) {}
我收到
error[E0038]: the trait `Trait` cannot be made into an object
--> src/lib.rs:11:29
|
5 | trait Trait: Sized {
| ----- ----- ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
...
11 | fn object_safety_dynamic(x: Trait) {}
| ^^^^^ the trait `Trait` cannot be made into an object
当我添加或删除: Sized
作为超特征或作为f
绑定时,我收到略有不同的错误消息。
有人可以解释一下:
为什么这个特定的例子不起作用?特征对象一章指出:
那么是什么让方法对象安全呢?每种方法都必须要求
Self: Sized
这不是实现了吗?
Trait: Sized
和 和有什么不一样where Self: Sized
?(嗯,是的,一个继承了 trait,另一个是参数绑定,但是从 Rust 的 trait 对象的角度来看?我必须做出的首选
object_safety_dynamic
改变是什么?
rustc 1.19.0-nightly (01951a61a 2017-05-20)
如果重要,我正在使用。
解决关于固定尺寸的评论。
trait TraitB {
fn f(&self) -> i32
where
Self: Sized;
fn g<T>(&self, t: T) -> i32
where
Self: Sized;
}