rust - 理论上是否可以专门化特质行为?

标签 rust traits

考虑以下场景:

  • 我想在所有实现特征 CanDo 的类型上实现特征 Do
  • CanDo 的类型中,有些类型实现了 CanDoQuickly 特征。
  • 我希望对于 CanDo 的类型以一种方式实现 Do,但对于 CanDoQuickly 的类型则以另一种方式实现CanDoQuickly 的类型。

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

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

最佳答案

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

关于rust - 理论上是否可以专门化特质行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56288073/

相关文章:

types - 如何检查功能参数的类型?

rust - 我可以创建一个自定义迭代器迭代一个序列然后另一个(链不起作用)

rust - 特征 std::ops::Try 没有为 impl 实现

rust - Rust 的生命周期

rust - 从特征方法返回特征对象时无法推断适当的生命周期

rust - 如何将方法作为回调/处理程序参数传递给函数? [复制]

c++ - 导致过载解析头痛的原因是什么?

traits - 当 trait 和 type 都不在这个 crate 中时提供一个实现

c++ - 标签 dispatching/enable_if - 我很困惑

php - 如果它们相同,为什么我会得到 "definition differs"?