gpt4 book ai didi

types - 我得到了一个预期的类型参数,尽管我认为我已经返回了正确的类型数据

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

我得到了一个预期的类型参数,尽管我认为我已经返回了正确的类型数据。我正处于 Rust 中通用 Material 的学习阶段。

struct Cat {
weight: i32,
}

trait Animal{
fn get_weight<T>(&self) -> T;
}

impl Animal for Cat {
fn get_weight<i32>(&self) -> i32 {
self.weight // I got error in here
}
}

fn main() {}

错误信息:

mismatched types

expected type parameter, found i32

note: expected type `i32` (type parameter)
found type `i32` (i32)

expected `i32` because of return type
expected type parameter, found i32

最佳答案

在这里查看编译器警告非常有帮助。

warning: type parameter `i32` should have an upper camel case name
--> src/main.rs:10:19
|
10 | fn get_weight<i32>(&self) -> i32 {
| ^^^ help: convert the identifier to upper camel case: `I32`
|
= note: #[warn(non_camel_case_types)] on by default

如您所见,i32括号之间被解析为类型参数。我相信这会在局部影响 i32 类型(具体来说,返回类型就是这个泛型),所以当你返回一个普通的 i32 时,编译器提示。这不是真正相关的,因为这不是问题的根源。

这里的问题是 Animal特质要求其 get_weight方法在 T 中是通用的.当你实现这个特征时,你必须提供一个 get_weight适用于所有 可能类型的方法 T (带有类型为 Sized 的隐式限制)。这应该是不可能的,因为您必须凭空生成任何给定类型的元素。有些类型甚至没有任何元素!

相反,您有两个选择。首先,您可以制作一个通用特征。语法是

trait Animal<T> {
fn get_weight(&self) -> T;
}

请注意 T与特征一起引入,而不是在方法上引入。使用此设置,您在概念上不再具有单一特征,而是每种类型都有一个特征(同样具有隐式 Sized 边界)。这意味着给定类型可以为 T 的不同值实现特征。 .就像你可能同时拥有 Animal<i32>Animal<u32>Cat 实现.

如果您仍然希望每个类型只实现一次特征并具有单一输出类型,则可以使用关联类型。语法是

trait Animal{
type Weight;

fn get_weight(&self) -> Self::Weight;
}

现在当你在一个类型上实现这个特性时,你必须提供输出类型。你可以实现 Cat通过添加行 type Weight = i32;在特征实现中。然后 get_weight方法只需要返回 i32 ,就像您已经拥有的一样。

关于types - 我得到了一个预期的类型参数,尽管我认为我已经返回了正确的类型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105093/

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