[英]How to implement a trait for a parameterized trait
我在使用类似的东西时遇到设计问题:
trait MyTrait<K: OtherTrait> { ... }
impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
由于E207错误(“类型参数K
不受impl特性,自身类型或谓词约束”),我无法为此特性实现特性。
为了找不到摆脱该错误的方法,我应用了这种不太好看的解决方法 (冗长和结构化,没有内在价值):
use std::fmt;
use std::marker::PhantomData;
pub trait MyTrait<K: fmt::Display> {
fn get_some_k(&self) -> Option<K>;
}
/* // This is my target impl but results in E207 due to K not constrained
impl<K: fmt::Display, S: MyTrait<K>> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
} */
pub struct Ugly<'a, K: fmt::Display, S: 'a + MyTrait<K>>(&'a S, PhantomData<K>);
impl<'a, K: fmt::Display, S: MyTrait<K>> fmt::Display for Ugly<'a, K, S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.get_some_k().unwrap())
}
}
fn main() { }
我认为应该有一些更好的方法来实现这种参数化特征的特征。
我没有在std中找到好的示例(例如,在具有关联类型(如Iterator
)的特征中没有Display
实现)?
这是使用关联类型的实现 (这意味着您只能为每种类型实现一个K
MyTrait
):
use std::fmt;
pub trait MyTrait {
type K: fmt::Display;
fn get_some_k(&self) -> Option<Self::K>;
}
impl<S: MyTrait> fmt::Display for S {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.get_some_k().unwrap())
}
}
fn main() { }
然而,当澄清这样它变得清晰,这种做法将不能工作,因为你是在实现Display
的实现各类MyTrait
-types可能有自己的Display
实现。 这是禁止的,因此您得到E0210:
错误:类型参数
S
必须用作某些局部类型的类型参数(例如MyStruct<T>
); 对于类型参数,只能实现当前包装箱中定义的特征[E0210]
像Ugly
一样,将其包装起来是允许这种实现的唯一方法。 或者在自己的箱子中而不是在别人的箱子中实现特质(例如Display
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.