gpt4 book ai didi

rust - 将 `trait Bar: Foo {}` 保存到 `struct Abc`

转载 作者:行者123 更新时间:2023-11-29 08:25:27 25 4
gpt4 key购买 nike

trait Foo {}
trait Bar: Foo {}

struct Zxc;
impl Foo for Zxc {}

struct Baz;
impl Bar for Baz {}
impl Foo for Baz {}

struct Abc<F: Foo> {
f: F
}
impl<F: Foo> Abc<F> {
fn bared<B: Bar>(&mut self, b: B) {
self.f = b;
}
}

fn main() {
let mut abc = Abc { f: Zxc };
abc.bared(Baz);
}

Try it on the playground .

Abc 存储 Foo 特征; abc.bared(Baz) 采用 Baz,它实现了 FooBar,但是类型不匹配在 Abc 中保存 Baz 时出错。如何解决?

最佳答案

ZxcBaz 是不相关的类型,您不能将一个分配给另一个。

如果您希望 Abc 能够使用“基类”Foo 存储它们,请使用 trait object ,例如

struct Abc {
f: Box<Foo>
}
// ^ Abc is not a template.

impl Abc {
fn bared<B: Bar + 'static>(&mut self, b: B) {
self.f = Box::new(b);
}
// ^ maybe you want to change it to take `b: Box<Bar>`
// it depends on how you want to expose the API.
}

fn main() {
let mut abc = Abc { f: Box::new(Zxc) };
abc.bared(Baz);
}

但是,Rust 的 OOP 范式与 Java 不同,特征对象可能不是最佳解决方案。或许您应该展示您想要解决的实际问题。

关于rust - 将 `trait Bar: Foo {}` 保存到 `struct Abc<Foo>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com