gpt4 book ai didi

generics - 是否可以在特征上使用通用函数?

转载 作者:行者123 更新时间:2023-11-29 08:25:05 25 4
gpt4 key购买 nike

我有:

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

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

但我得到:

error[E0038]: the trait `Grumbo` cannot be made into an object
--> plumbus.rs:4:5
|
4 | grumbo: &'a Grumbo,
| ^^^^^^^^^^^^^^^^^^ the trait `Grumbo` cannot be made into an object
|
= note: method `dinglebop` has generic type parameters

我想让 dinglebop 默认不做任何事情,但是根据 GrumboT,可能会填充 x 如果它对特定的 Grumbo 实现有意义,则带有 T

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

  • 是否可以在 trait 上使用这样的通用函数?
  • 如何实现我的目标,即为任意 T 使用 dinglebop(),而无需为 特定 T?

最佳答案

Is it possible to have a generic function on a trait?

是的。但是您随后试图将该特征用作对象。如果特征具有泛型方法,则您不能将其用作对象,但您仍然可以将其用作类型参数的绑定(bind)。

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

struct Plumbus<'a, T: Gumbo> { 
grumbo: &'a T,
}

有了 trait 对象,实现只在运行时才知道。而且它的泛型参数是实现类型的一部分,所以编译器不知道如何调用它。使用 T: Gumbo,您对 T 可以是什么施加了限制,但是 T 在使用时编译器始终知道,其中包括它自己的任何参数。

另见:

关于generics - 是否可以在特征上使用通用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49952612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com