【问题标题】:Is it theoretically possible to specialise trait behaviour?理论上可以专门化特质行为吗?
【发布时间】:2019-05-24 16:50:25
【问题描述】:

考虑以下场景:

  • 我想在所有实现 trait CanDo 的类型上实现 trait Do
  • CanDo 的类型中,一些实现了特征CanDoQuickly
  • 我希望Do 以一种方式实现CanDo 而不是CanDoQuickly,并以另一种方式实现CanDoQuickly

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

我想知道是否有可能,无论代码的复杂性如何,都可以在稳定的 Rust 上实现我想要做的事情。如果不是,这是一种设计选择吗?想做这样的事情本质上是不好的吗?对我来说,这听起来像是一个常见的问题,如果我发现这是一种已弃用的做法,我会感到非常惊讶。

【问题讨论】:

标签: rust traits


【解决方案1】:

可能在 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();
}

【讨论】:

  • 我明白了。有趣的!有没有估计specialization 需要多长时间才能使其成为稳定的 Rust?你的回答是否暗示在稳定的 Rust 中不可能做同样的事情?
  • 至于时间线,这就是跟踪问题的目的。它已经三年多了,剩下的问题看起来并不容易,所以我不会屏住呼吸。
猜你喜欢
  • 2019-08-11
  • 2019-12-20
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多