当前位置: 首页 > 知识库问答 >
问题:

具有关联类型的工厂方法

蒙麒
2023-03-14

这是服务:

trait QType {}

trait Service {
    type Query: QType;

    fn sanitize(&self, query: &str) -> Result<Self::Query, String>;

    fn run(&self, query: &Self::Query) -> Result<(), String>;
}

因此,其思想是sanitize函数返回query的一个实例,然后可以将该实例传递给run函数。

工厂看起来是这样的(不编译):

fn factory<Q: QType>(name: &str) -> Box<dyn Service<Query = Q>> {
    match name {
        "amazon" => Box::new(amzn::Amazon {}),
        other => panic!("Invalid service {}", other),
    }
}
mod amzn {
    use super::*;

    pub struct Amazon {}

    pub struct Product {
        name: String,
    }

    impl QType for Product {}

    impl Service for Amazon {
        type Query = Product;
        fn sanitize(&self, query: &str) -> Result<Product, String> {}
        fn run(&self, query: &Product) -> Result<(), String> {}
    }
}
error[E0271]: type mismatch resolving `::Query == Q`
 --> src/main.rs:9:21
  |
9 |         "amazon" => Box::new(amzn::Amazon {}),
  |                     ^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `amzn::Product`
  |
  = note: expected type `Q`
             found type `amzn::Product`
  = help: type parameters must be constrained to match other types
  = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
  = note: required for the cast to the object type `dyn Service`

非常感谢任何帮助。

共有1个答案

施翰学
2023-03-14

无法实现此签名:

fn factory<Q: QType>(name: &str) -> Box<dyn Service<Query = Q>>

关联类型始终由实现类型唯一确定。即。service的每个实现只选择一个关联类型query

这与factory不一致,后者让调用方决定关联的类型应该是什么。应该清楚地看到,如果使用不是productQ调用Factory,则match表达式中的代码不再进行类型检查。

fn factory(name: &str) -> Box<dyn Service<Query = Product>> {
    match name {
        "amazon" => Box::new(amzn::Amazon {}),
        other => panic!("Invalid service {}", other),
    }
}
trait QType {
    fn create_service(name: &str) -> Option<Box<dyn Service<Query = Self>>>;
}

fn factory<Q: QType>(name: &str) -> Box<dyn Service<Query = Q>> {
    Q::create_service(name).expect("Invalid service")
}
impl QType for Product {
    fn create_service(name: &str) -> Option<Box<dyn Service<Query = Self>>> {
        match name {
            "amazon" => Some(Box::new(amzn::Amazon {})),
            other => None,
        }
    }
}
 类似资料:
  • 我的Laravel 5.2应用程序具有以下结构: 用户:id名称。。。 文章: id标题正文user_id(fk) 注释:id主体用户id(fk)发布id(fk) 我想创建几个用户(20个),为每个用户创建随机数量的帖子,并为每个帖子创建随机数量的评论(即使是固定数量也可以)。 我可以创建用户并为每个帖子分配帖子,但我不能为每个帖子分配评论:我有: 我发现了一些东西,但不起作用: 注意:我在模型之

  • 在一个具有(控制器-服务-DAO-实体层)的spring hibernate Java项目中,我使用了抽象工厂模式(抽象类有2个抽象方法)。在实现的抽象工厂模式类中,我有dao方法(运行命名查询)。现在,当请求到达来自另一个服务类的dao的服务impl时,它给出了空指针删除,我已经在服务impl中自动连线了dao类` 我不能将@Service(“AbstractFruitService”)添加到S

  • 使用“关联类型”可以增强代码的可读性,其方式是移动内部类型到一个 trait 作为output(输出)类型。这个 trait 的定义的语法如下: // `A` 和 `B` 在 trait 里面通过`type` 关键字来定义。 // (注意:此处的 `type` 不同于用作别名时的 `type`)。 trait Contains { type A; type B; // 通常

  • 我使用下面的代码创建了20篇帖子,每个帖子都有3条评论。 相反,我想创建20个帖子,每个帖子都有随机数量的评论(例如,帖子1有2个评论,帖子2有4个评论,等等)。) 这不起作用,每个帖子都有相同(随机)数量的评论。 我怎样才能做到这一点?

  • 关联类型 定义一个协议时, 有时在协议定义里声明一个或多个关联类型是很有用的. 关联类型给协议中用到的类型一个占位符名称. 直到采纳协议时, 才指定用于该关联类型的实际类型. 关联类型通过associatedtype关键字指定. 关联类型的应用 protocol Container { associatedtype ItemType mutating func append(_ i

  • 问题内容: 这是hrert的问题Generic类与其他类型的Collectiongetter的后续文章。如果您可以为我的问题找到更好的标题,请随时对其进行编辑: 下面的代码包含一个具有返回类型方法的通用类和具有返回类型方法的另一个方法,显然与。 现在,如果我实例化一个原始数据(我永远不会做,所以这个问题更多是一个理论问题,以帮助理解正在发生的事情),那么在增强的for循环中调用该方法将不起作用,因