【发布时间】:2020-05-12 17:11:26
【问题描述】:
我正在尝试实现一个工厂方法,该方法返回具有关联类型的Service。我让它在没有关联类型的情况下工作,但是一旦我添加它,无论我如何按摩它,我都无法让它编译..
这是Service:
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),
}
}
现在我这里只有一个服务,我可以在签名中指定类型参数——这将使它编译——但我想要一个通用工厂方法并添加更多服务。
这是Amazon服务的实现:
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> {}
}
}
编译器说:
错误[E0271]:类型不匹配解析`::Query == Q` --> src/main.rs:9:21 | 9 | “亚马逊” => Box::new(amzn::Amazon {}), | ^^^^^^^^^^^^^^^^^^^^^^^^^ 预期类型参数,找到 struct `amzn::Product` | =注意:预期类型`Q` 找到类型`amzn::Product` = help: 类型参数必须被约束以匹配其他类型 = 注意:有关更多信息,请访问 https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters = 注意:强制转换为对象类型 `dyn Service` 是必需的基于此错误消息,我不确定如何指定类型参数。我已经尝试提取Amazon 的创建并为其提供显式类型参数,但这只会留下不同的错误。此外,在本书链接的第 10.02 章之后,并没有对关联类型的案例进行任何解释。最后,我也尝试了RFC-1598: Generic Associated Types的路由,但我无法编译,也不确定我是否真的需要它。
另外请注意,我添加了 Box 包装器和 QType 限制,基于其他关于类似问题的答案,但我可能完全走错了路..
非常感谢任何帮助。
【问题讨论】:
标签: rust