【发布时间】:2017-05-27 00:35:54
【问题描述】:
由于此错误的两个实例,以下代码将无法编译:
error[E0277]: trait bound
Self: std::marker::Sized不满足
我不明白为什么在这种情况下需要Sized,因为&self 和&Any 都是指针,并且该操作不需要知道实现特征的结构的大小,它只需要知道指针本身和它正在转换的类型,因为&self 在 trait 中实现时是通用的。
我认为这可能是编译器强制执行不必要约束的一个实例,我已经考虑向 rust-lang GitHub 存储库提交问题,但我想我应该看看这里是否有人知道我不知道的事情,然后再去提出问题。
use std::any::Any;
trait Component: Any {
fn as_any(&self) -> &Any {
self
}
fn as_any_mut(&mut self) -> &mut Any {
self
}
}
对此的替代方法是为实现此特征的结构创建as_any() 和as_any_mut() 所需的函数,但对于这些结构,实现将始终与此处显示的每个字符完全相同,从而导致多个实例相同的样板代码。
【问题讨论】:
-
我删除了我的答案,因为我找不到足够快的文档链接。不过,我的理解是,traits 中的
Self是未调整大小的,并且如果没有将您的特征明确标记为Sized,编译器会将其视为未调整大小和错误。 -
我认为制作所需的方法是要走的路。至少我以前见过这种模式。为避免重复代码,您可以编写一个简单的宏
impl_conversion_functions!()或类似的东西。
标签: rust type-conversion traits coercion