从理论上讲,特质行为是否可能?

时间:2019-05-24 07:48:49

标签: rust traits

请考虑以下情形:

  • 我想在实现特征Do的所有类型上实现特征CanDo
  • CanDo的类型中,有些实现了特征CanDoQuickly
  • 我希望为Do而不是CanDo的那些类型以一种方式实现CanDoQuickly,而对于CanDoQuickly的那些类型以另一种方式实现。 / li>

我知道,在Rust中,我们没有负面特质界限。我的直觉是,我们应该应该可以使用内置的opt-in来实现此目的(尽管我没有尝试成功)。

我想知道,无论代码的复杂性如何,都可以在稳定的Rust上实现我想做的事情。如果不是,这是设计选择吗?想要做这样的事情天生就不好吗?对我来说,这听起来像是一个普遍的问题,令我惊讶的是,这是一种过时的做法。

1 个答案:

答案 0 :(得分:2)

nightly上,仍可能具有不稳定的specialization功能和default实现(另请参见the tracking issue for specialization):

#![feature(specialization)]

trait DoIt {
    fn do_it(&self);
}

impl<T> DoIt for T
where
    T: CanDo,
{
    default fn do_it(&self) {
        self.do_impl()
    }
}

impl<T> DoIt for T
where
    T: CanDoQuickly,
{
    fn do_it(&self) {
        self.do_quickly_impl()
    }
}

trait CanDo {
    fn do_impl(&self) {
        println!("slowly");
    }
}

trait CanDoQuickly: CanDo {
    fn do_quickly_impl(&self) {
        println!("quickly");
    }
}

struct S1;
impl CanDo for S1 {}
impl CanDoQuickly for S1 {}

struct S2;
impl CanDo for S2 {}

fn main() {
    S1.do_it();
    S2.do_it();
}