[英]How can a Rust trait object return another trait object?
如何在 Rust 中尝试类似以下的操作?
builder 类是一个 trait 对象,它返回另一个 trait 对象(类型擦除),其中选择的实现由我们正在使用的 builder trait 的特定对象定义。
trait Builder {
// I want this trait to return a trait object
fn commits(&self) -> dyn Commit;
fn finish(&self);
}
trait Commit {
}
struct FooBuilder {
}
struct FooCommit {
}
impl Builder for FooBuilder {
fn commits(&self) -> impl Commit {
FooCommit{ }
}
fn finish(&self) {
}
}
fn get_commits(b: &Builder) {
// trait object returns a trait
let c = b.commits();
}
fn main() {
let b = FooBuilder{};
get_commits(&b);
b.finish();
}
从 Rust 中的 trait 方法返回 trait 对象没有问题:
trait Foo {
fn bar(&self) -> Box<dyn Bar>;
}
需要注意的一件事是您需要返回Box<dyn Bar>
,而不是dyn Bar
,因为在编译时不知道dyn Bar
大小,这使得它无用。
当你实现这个特性时,签名必须匹配,所以它应该返回Box<dyn Bar>
,而不是impl Bar
:
impl Foo for MyFoo {
fn bar(&self) -> Box<dyn Bar> {
Box::new(MyBar{})
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.