【发布时间】:2015-08-07 01:27:05
【问题描述】:
我在使用类似的东西时遇到了设计问题:
trait MyTrait<K: OtherTrait> { ... }
impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }
由于 E207 错误,我无法为此 trait 实现 trait(“类型参数 K 不受 impl trait、self 类型或谓词的约束”)。
找不到摆脱这个错误的方法,我申请了this not-so-good-looking workaround(详细和没有内在价值的结构):
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)?
【问题讨论】:
-
只是想我会提到我遇到了完全相同的问题,但是我没有将毯子 impl 包裹在
Ugly中的奢侈,因为MyTrait是公开的向用户公开的 trait 并要求他们使用Ugly通过增加不必要的复杂性彻底破坏 API。