我可以有一个泛型函数来接受所有未实现特征的类型吗?

时间:2019-04-08 00:14:25

标签: rust traits

我知道我可以让函数只接受实现给定特征的类型。例如,我可以

fn f<T>()
where
    T: MyTrait,
{
    // Super useful stuff
}

如果我想实现一个接受任何实现给定特征的函数,该怎么办?例如,假设我进行了一些计算,或者:

  • 需要一些已知的冗长的预处理,或者
  • 具有简化该预处理过程的特定方式。

我想做的事情是这样的:

fn preprocess<T>(computation: &mut T)
where
    T: !Shortcut,
{
    // Carry out the expensive precomputation.
}

我试图弄清楚如何解决此问题,但似乎无法找出任何解决方案。

1 个答案:

答案 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]

另请参阅: