我知道我可以让函数只接受实现给定特征的类型。例如,我可以
fn f<T>()
where
T: MyTrait,
{
// Super useful stuff
}
如果我想实现一个接受任何不实现给定特征的函数,该怎么办?例如,假设我进行了一些计算,或者:
我想做的事情是这样的:
fn preprocess<T>(computation: &mut T)
where
T: !Shortcut,
{
// Carry out the expensive precomputation.
}
我试图弄清楚如何解决此问题,但似乎无法找出任何解决方案。
答案 0 :(得分:5)
不,您不能。
相反,您可以使用 unstable 专业化功能来选择采用更有效的处理方式:
#![feature(specialization)]
trait Process {
fn process(self);
}
trait Short {}
impl Short for i32 {}
impl<T> Process for T
where
T: std::fmt::Debug,
{
default fn process(self) {
println!("Processing {:?}", self)
}
}
impl<T> Process for T
where
T: std::fmt::Debug + Short,
{
fn process(self) {
println!("Shortcut {:?}", self)
}
}
fn main() {
42i32.process();
vec![1, 2, 3].process();
}
Shortcut 42
Processing [1, 2, 3]
另请参阅: