【问题标题】:Can I have a generic function that accepts all types that do not implement a trait?我可以有一个通用函数来接受所有不实现特征的类型吗?
【发布时间】:2019-04-08 09:50:34
【问题描述】:

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

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

如果我想实现一个函数来接受任何实现给定特征的东西怎么办?例如,假设我有一些计算:

  • 需要一些已知的、冗长的预处理,或者
  • 有一种特定的方法可以简化该预处理。

我想做的是这样的:

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

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

【问题讨论】:

  • 看起来这在 Rust 中现在不可用。回购中有active discussion关于它,但到目前为止还没有承诺。您正在寻找的术语是“负面特征界限”。
  • 拥有一个实现preprocess的编译接口和编译过程的其余部分,而不是一个Shortcut trait。不需要预处理的可以实现一个空函数。这是一种 OO 方法而不是程序方法,您要求事物进行自己的预处理。

标签: rust traits


【解决方案1】:

不,你不能。

相反,您可以以另一种方式使用 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]

另见:

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多