如何正确地要求其他特征的特征?

时间:2017-12-21 10:37:49

标签: rust

我试着编写两个特征,其中一个需要另一个特征实现并得到这个错误:

error[E0277]: the trait bound `T: ValTrait` is not satisfied
  --> src/main.rs:20:1
   |
20 | / fn get<T: ValRequireTrait + std::fmt::Debug>(_t: T) {
21 | |     println!("{:?}", T::VAL);
22 | | }
   | |_^ the trait `ValTrait` is not implemented for `T`
   |
   = help: consider adding a `where T: ValTrait` bound
   = note: required by `ValRequireTrait`

The code

trait ValTrait<T = Self> {
    const VAL: T;
}

trait ValRequireTrait<T: ValTrait = Self> {}

#[derive(Debug, Copy, Clone)]
struct A {
    field: u64,
}

impl ValTrait for A {
    const VAL: A = A {
        field: 0u64
    };
}
impl ValRequireTrait for A {}


fn get<T: ValRequireTrait + std::fmt::Debug>(_t: T) {
    println!("{:?}", T::VAL);
}

fn main() {
    let a = A { field: 6u64 };
    get(a);
}

如何正确执行此操作?如果我按照编译器说的那样做,我将不需要ValRequireTrait,因为它将是无用的。我希望ValRequireTrait成为结构实现我需要的足够方法的标记。

换句话说,我希望这样的要求是可传递的,所以当在get()函数中我需要一个特征(ValRequireTrait)时,其他(ValTrait)将自动被要求而没有任何规范在编译器想要的代码中。

1 个答案:

答案 0 :(得分:3)

听起来你希望version成为In [1]: import xml.etree.ElementTree as ET In [2] ns = {"pom": "http://maven.apache.org/POM/4.0.0"} In [3] print ET.parse("pom.xml").findall(".//pom:dependencies/pom:dependency[pom:artifactId='some-artifact-with-hardcoded-version']/pom:version", ns)[0].text Out[1]: '1.2.3' 超级。可以在the Rust book (2nd edition)中找到一个很好的介绍:

  

有时候,我们可能希望某个特质能够依赖于在我们的特征实施的任何地方实施的另一个特征,这样我们的特性就可以使用其他特征的功能。所需的特质是我们正在实施的特质的超级特征。

如果您更改此行:

ValTrait

对此,编译很好:

ValRequireTrait