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

时间:2015-05-25 14:20:40

标签: rust traits

使用类似的东西时,我遇到了设计问题:

trait MyTrait<K: OtherTrait> { ... }

impl<K: OtherTrait, M: MyTrait<K>> AnyTrait for M { ... }

由于E207错误,我无法为此特征实现特征(&#34;类型参数K不受impl trait,self type或谓词&#34;)的约束。

没有办法摆脱这个错误,我应用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中找到好的示例(例如在Display之类的关联类型的特征中没有Iterator实现?

1 个答案:

答案 0 :(得分:2)

{{3}}(这意味着您只能为每种类型var elm = element(by.id("Grid")); var data = browser.executeScript("return arguments[0].jqxGrid('exportdata', 'json');", elm.getWebElement()); 实施MyTrait

K

但是,如果澄清这样,很明显这种方法也不会起作用,因为您正在为实现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类型Display 1}}实施。这是禁止的,所以你得到E0210:

  

错误:类型参数S必须用作某些本地类型的类型参数(例如MyStruct<T>);只有当前包中定义的特征可以为类型参数[E0210]

实现

将它包装成某种东西 - 就像你的Ugly所做的那样 - 是允许这种实现的唯一方法。或者在你自己的箱子里实现一个特性而不是别人的特质(比如Display)。