我有一个设计问题,当使用类似以下的代码时:
trait MyTrait<K: OtherTrait> { ... }
impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
由于出现了 E207 错误(“类型参数 K
没有被 impl trait、self type 或 predicates 约束”),我无法为此 trait 实现 trait。
找不到解决此错误的方法,所以我采用了这个不太好看的解决方法(冗长且没有内在价值的结构):链接
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() { }
我认为应该有一种更好的方式来实现这种参数化特质。
在标准库中,我没有找到很好的例子(例如,对于像Iterator
这样具有关联类型的特质没有Display
实现)?
impl
在一个Ugly
中的奢侈条件,因为MyTrait
是向用户公开的公共特质,并要求他们使用一个Ugly
会通过增加不必要的复杂性来破坏API。 - mindTree