我正在尝试制作一些适用于数字的通用函数,但是我在函数签名方面苦苦挣扎。
也许我是从错误的角度来解决问题,但到目前为止,这是我独自解决的问题。我并不介意以这种方式进行这项工作;因此,如果我从错误的角度来解决这个问题(创建一个通常有用的数学函数的小库),那么一定可以教育我。
假设我要一个函数add
,该函数将两个数字相加:
use std::ops::Add;
fn add(a: Add, b: Add) -> Add::Output {
a + b
}
这不会编译。不过这里是一个游乐场: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
我已经在Rust的书中读过the chapter on advanced traits,所以我“了解/了解”了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
,这将消失,但这不是我想要的。我特别希望该函数在任何可以累加的函数上工作(假设a
和b
属于同一类型)。
答案 0 :(得分:2)
您要混合特征和类型。
Add
是特征。可以为一个类型或一类类型实现特征,但它不是类型本身。
函数参数需要使用 type 而不是特征来声明。这是原型的主要问题– Add
不是类型,因此不能将其用作变量或函数参数的类型。
Rust允许您声明通用类型,本质上是类型变量。然后,可以将特征范围放在通用类型上,这要求任何替代通用类型的类型都必须实现某些特征。您使用通用类型参数T
的示例如下:
fn add<T: Add>(a: T, b: T) -> T::Output
此原型要求a
和b
都具有相同的类型T
,并且T
实现Add
特质。