考虑以下场景:
- 我想在所有实现特征
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/