[英]Rust polymorphism in trait objects with associated types
我有许多满足通用接口的实现的特征:
pub trait Schema<'a> {
// ConfigTypes will be parsed from HTTP POST requests, but different
// implementations can have different fields and know how to parse
// themselves
type ConfigType: rocket::request::FromForm<'a>
fn configure(&mut self, cfg: Self::Configure);
// and more...
}
现在想象一下,我想从任意字符串中实现一个简单的键/值存储到 map 任意数量的这些模式。 我觉得 HashMap 应该可以做到这一点,但是类型是什么?
use std::collections::HashMap;
struct Datastore<'a> {
cache: HashMap<String, dyn Schema<'b>>
}
这失败了,抱怨必须指定关联类型ConfigType
,但我想在这个缓存后面存储Schema
的任何实现!
我预计问题出在不规则尺寸上,因为 HashMap 的值预计具有 static 尺寸。 好吧 - 让我们将 Boxes 添加到事物中。
// as above
struct Datastore<'a> {
cache: HashMap<String, Box<dyn Schema<'b>>>
}
但唉 - 出现同样的错误。 如何定义此结构以容纳任何 Schema 实现者?
关联的类型必须是已知的。 否则,当您调用使用该类型的方法时,编译器如何知道要使用哪种类型?
有几种方法可以解决这个问题:
Box<dyn Schema<ConfigType = &dyn rocket::request::FromForm<'b>, 'b>
您可能必须为&dyn rocket::request::FromForm<'b>
实现rocket::request::FromForm<'b>
&dyn rocket::request::FromForm<'b>
所以它可以向下转换并将其传递给正确的类型。Box<dyn Any>
。 现在,您必须先对其进行向下转换,然后才能使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.