是否有可能对特征有一个通用函数?

trb*_*abb 7 generics traits rust

我有:

struct Plumbus<'a> {
    grumbo: &'a dyn Grumbo,
}

trait Grumbo {
    fn dinglebop<T>(&self, x: &mut T) -> bool { false }
}
Run Code Online (Sandbox Code Playgroud)

但我得到:

struct Plumbus<'a> {
    grumbo: &'a dyn Grumbo,
}

trait Grumbo {
    fn dinglebop<T>(&self, x: &mut T) -> bool { false }
}
Run Code Online (Sandbox Code Playgroud)

我希望dinglebop默认情况下不执行任何操作,但根据Grumbo和,如果对特定实现有意义T,可能会填充xa 。TGrumbo

在 C++ 中,这可能可以通过部分专业化来完成。我不确定 Rust 的目标是什么。

  • 是否可以在特征上使用这样的通用函数?
  • 我如何实现拥有dinglebop()任意目标T而不专门Plumbus针对特定目标的 T目标?

Pet*_*all 5

是否有可能对特征有一个通用函数?

是的。但你随后尝试将特征用作对象。如果特征具有泛型方法,那么您不能将其用作对象,但您仍然可以将其用作类型参数的绑定。

也就是说,不使用&'a Gumbo,而是使用 a T: Gumbo

struct Plumbus<'a, T: Gumbo> { 
    grumbo: &'a T,
}
Run Code Online (Sandbox Code Playgroud)

对于特征对象,只有在运行时才知道其实现。而且它的泛型参数是实现类型的一部分,因此编译器无法知道如何调用它。你对可能发生的T: Gumbo事情施加了限制T,但是T编译器在使用时始终会知道,其中包括其自身的任何参数。

也可以看看: