【发布时间】:2019-03-08 10:52:33
【问题描述】:
此代码运行良好 (playground):
use std::rc::Rc;
trait Foo {
fn foo(&self);
}
struct Bar<T> {
v: Rc<T>,
}
impl<T> Bar<T> where
T: Foo {
fn new(rhs: Rc<T>) -> Bar<T> {
Bar{v: rhs}
}
}
struct Zzz {
}
impl Zzz {
fn new() -> Zzz {
Zzz{}
}
}
impl Foo for Zzz {
fn foo(&self) {
println!("Zzz foo");
}
}
fn make_foo() -> Rc<Foo> {
Rc::new(Zzz{})
}
fn main() {
let a = Bar::new(Rc::new(Zzz::new()));
a.v.as_ref().foo()
}
但是如果我像下面那样制作一个包装器来生成 Rc,编译器会抱怨缺少大小特征 (playground)
fn make_foo() -> Rc<dyn Foo> {
Rc::new(Zzz::new())
}
fn main() {
let a = Bar::new(make_foo());
a.v.as_ref().foo()
}
在这两种情况下,Bar::new 都接收到具有相同类型 Rc 的参数,为什么 rust 编译器的反应不同?
【问题讨论】:
-
应用于本题:
T默认有Sized约束,实现new(rhs: Rc<T>)时应去掉:impl<T: ?Sized> Bar<T> where T: Foo { ... }。
标签: rust traits smart-pointers trait-objects