繁体   English   中英

如何为参数化特征实现特征

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM