gpt4 book ai didi

rust - 如何使用泛型方法实现特征?

转载 作者:行者123 更新时间:2023-12-03 11:48:32 34 4
gpt4 key购买 nike

我正在尝试实现包含通用方法的特征。

trait Trait {
fn method<T>(&self) -> T;
}

struct Struct;

impl Trait for Struct {
fn method(&self) -> u8 {
return 16u8;
}
}

我得到:

error[E0049]: method `method` has 0 type parameters but its trait declaration has 1 type parameter
--> src/lib.rs:8:5
|
2 | fn method<T>(&self) -> T;
| ------------------------- expected 1 type parameter
...
8 | fn method(&self) -> u8 {
| ^^^^^^^^^^^^^^^^^^^^^^ found 0 type parameters

我应该如何正确写 impl块?

最佳答案

函数和方法中的类型参数是通用的。这意味着对于所有特征实现者,必须对所有Trait::method<T>实现T,并使用与特征所指示的约束完全相同的约束(在这种情况下,对T的约束仅是隐式Sized)。

您指示的编译器错误消息表明它仍在使用参数类型T。相反,您的Struct实现假定使用T = u8,这是不正确的。类型参数由方法的调用者而不是实现者决定,因此T不一定总是u8

如果希望让实现者选择特定类型,则必须将其具体化为关联的类型。

trait Trait {
type Output;

fn method(&self) -> Self::Output;
}

struct Struct;

impl Trait for Struct {
type Output = u8;

fn method(&self) -> u8 {
16
}
}

另请阅读Rust编程语言的这一部分: Specifying placeholder types in trait definitions with associated types

也可以看看:
  • "Expected type parameter" error in the constructor of a generic struct
  • When is it appropriate to use an associated type versus a generic type?
  • 关于rust - 如何使用泛型方法实现特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62255434/

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