通用编号的功能签名

时间:2018-11-06 12:32:25

标签: rust

我正在尝试制作一些适用于数字的通用函数,但是我在函数签名方面苦苦挣扎。

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

假设我要一个函数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,这将消失,但这不是我想要的。我特别希望该函数在任何可以累加的函数上工作(假设ab属于同一类型)。

1 个答案:

答案 0 :(得分:2)

您要混合特征类型

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

函数参数需要使用 type 而不是特征来声明。这是原型的主要问题– Add不是类型,因此不能将其用作变量或函数参数的类型。

Rust允许您声明通用类型,本质上是类型变量。然后,可以将特征范围放在通用类型上,这要求任何替代通用类型的类型都必须实现某些特征。您使用通用类型参数T的示例如下:

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

此原型要求ab都具有相同的类型T,并且T实现Add特质。