【发布时间】:2019-11-21 16:22:30
【问题描述】:
我有这个代码:
fn main() {
let p = Person;
let r = &p as &dyn Eatable;
Consumer::consume(r);
// Compile error
Consumer::consume_generic(r);
}
trait Eatable {}
struct Person;
impl Eatable for Person {}
struct Consumer;
impl Consumer {
fn consume(eatable: &dyn Eatable) {}
fn consume_generic<T: Eatable>(eatable: &T) {}
}
错误:
dyn Eatable类型值的大小无法在 编译时间
我觉得很奇怪。我有一个方法,它实际上采用dyn Eatable 并编译得很好,所以该方法以某种方式知道Eatable 的大小。泛型方法 (consume_generic) 将针对每种使用的类型正确编译以提高性能,而 consume 方法则不会。
所以出现了几个问题:为什么编译器出错? 方法体内是否有一些东西可以让我做其他方法无法做到的事情?我应该在什么时候更喜欢其中一个?
旁注:我也针对 Swift 语言提出了这个问题:Differences generic protocol type parameter vs direct protocol type。在 Swift 中,我得到相同的编译错误,但底层错误不同:协议/特征不符合自身(因为 Swift 协议可以保存初始化程序、静态事物等,这使得一般地引用它们变得更加困难)。我也在Java中尝试过,我相信泛型类型被删除了,它完全没有区别。
【问题讨论】:
标签: rust