gpt4 book ai didi

rust - 通用数字的函数签名

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

我正在尝试制作一些适用于数字的通用函数,但我正在努力处理函数签名。

也许我是从错误的角度来解决这个问题,但到目前为止,这是我自己解决的问题。我并不一定要以这种方式完成这项工作;因此,如果我从错误的角度解决问题(创建一个小的通用数学函数库),那么一定要教育我。

假设我想要一个函数,add将两个数字相加:

use std::ops::Add;

fn add(a: Add, b: Add) -> Add::Output {
a + b
}

这不会编译。不过这里有一个 Playground :https://play.integer32.com/?version=stable&mode=debug&edition=2015&gist=4589325b5c8d1f1b19440424878caa98

我基本上遇到了两个错误。第一个:

error[E0393]: the type parameter `RHS` must be explicitly specified
--> src/main.rs:8:11
|
8 | fn add(a: Add, b: Add) -> Add::Output {
| ^^^ missing reference to `RHS`
|
= note: because of the default `Self` reference, type parameters must be specified on object types

我已阅读 the chapter on advanced traits在 Rust 书中,所以我“有点/有点”理解 RHS消息,但他们解决了添加 Add 的问题特定数据结构的特征(示例中的 Point);但永远不要显示接受任何可以加起来的函数的函数签名。所以我有点迷路。

第二个错误:

error[E0223]: ambiguous associated type
--> src/main.rs:8:27
|
8 | fn add(a: Add, b: Add) -> Add::Output {
| ^^^^^^^^^^^ ambiguous associated type
|
= note: specify the type using the syntax `<Type as std::ops::Add>::Output`

如果我写 <i32 as Add>::Output,它就会消失,但这不是我想要的。我特别希望该函数适用于任何可以加起来的东西(假设 ab 是同一类型)。

最佳答案

您正在混淆特质类型

Add 是一个trait。特征可以为一个类型或一类类型实现,但它本身不是一个类型。

函数参数需要用类型声明,而不是特征。这是您的原型(prototype)的主要问题 - Add 不是类型,因此您不能将其用作变量或函数参数的类型。

Rust 允许您声明泛型,本质上是类型变量。然后,您可以将 trait bounds 放置在泛型类型上,这要求替换泛型类型的任何类型都必须实现某些 trait。使用泛型类型参数 T 的示例如下所示:

fn add<T: Add>(a: T, b: T) -> T::Output

此原型(prototype)要求ab 都具有相同的类型T,并且T 实现了添加特征。

关于rust - 通用数字的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53171992/

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