当前位置: 首页 > 知识库问答 >
问题:

泛型数的函数签名

伯英锐
2023-03-14

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

也许我是从错误的角度来讨论这个问题,但到目前为止,我是在这里独立完成的。我并不是一心要这样做;因此,如果我从错误的角度来解决这个问题(创建一个通常有用的数学函数库),那么一定要教育我。

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

use std::ops::Add;

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

这不会编译。这里是一个游乐场:https://play.integer32.com/?version=stable

我基本上有两个错误。第一个:

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 book中关于高级特征的章节,所以我“有点/有点”理解了RHS的信息,但它们解决了将Add特征添加到特定数据结构中的问题(示例中的);但是永远不要显示一个函数的函数签名,该函数包含任何可以相加的内容。所以我有点迷路了。

第二个错误:

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`

如果我写


共有1个答案

彭畅
2023-03-14
匿名用户

你把性格和类型混为一谈。

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

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

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

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

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

 类似资料:
  • 同样的规则也可以适用于函数:在使用前给出 <T> 后,类型 T 就变成了泛型。 使用泛型函数有时需要显式地指明类型参量。这种可能的情况包括,调用返回类型是泛型的函数,或者编译器没有足够的信息来推导类型参量。 函数调用使用显式指定的类型参量,如下所示: fun::<A, B, ...>(). struct A; // 具体类型 `A`。 struct S(A); //

  • 问题内容: 我正在学习中,文档和交互式课程说,空可以容纳任何类型,因为它不需要其他实现的方法。 举个例子: …将打印出来… 因此,我想我的问题是这是实现通用函数的方法,还是还有另一种更合适的方法来实现它们。 问题答案: Go范式通常是通过在非空接口中实现行为来避免这种情况。例如,假设您要打印特定于类型的格式的内容: 或者,您可以为知道如何进行字符串自身设置的接口定义一个接口(该接口在库中以形式存在

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。

  • 泛型函数定义 泛型函数可以用于任何类型. 这里是上面提到的swapTwoInts(_:, _:)函数的泛型版本, 叫做swapTwoValues(_:_:) func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } 上面的s

  • 如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法

  • 有没有一个相当标准的C(Linux)函数,或者一种代码高效但性能良好的方法来比较任意大小的两个整数? 我正在寻找一些参数为int intcmp(const void*a,const void*b,size\t size)的东西,它适用于任何实际大小的整数。(如果架构是big-endian的话(我认为)可以工作。) 我倾向于使用这样的实现(通过高效整数比较函数的改进),但它不是完全通用的,并且有足够