为什么在 Rust 中我们需要用函数名而不是参数签名来定义泛型类型?

Avi*_*ava 2 rust

浏览Rust 官方书籍的泛型类型章节,我注意到我们必须如下定义泛型函数:

fn largest<T>(list: &[T]) -> T {

我的疑问是:为什么<T>要在 后面添加largest?我们不会对非泛型函数执行此操作,例如:fn largest(list: &[i32]) -> i32

Sil*_*olo 8

它们意味着两个不同的(并且同样有效的)事物

fn largest<T>(list: &[T]) -> T
Run Code Online (Sandbox Code Playgroud)

这表示“largest是一个函数,对于任何类型T,它都会获取一个切片T并返回一个T”。另一方面,

fn largest(list: &[T]) -> T
Run Code Online (Sandbox Code Playgroud)

该函数表示“largest获取一部分T并返回一个T”,其中T是作用域中的某些特定类型。也就是说,第二个定义假设有某种形式

struct T {}
Run Code Online (Sandbox Code Playgroud)

或一些其他类型声明、别名或现在范围内的导入,并且largest 适用于该类型。请注意,对于特定类型来说,这T是一个可怕的名称,但 Rust 并不关心好名称。就 Rust 而言,T是一个完全有效的类型。也是如此ndscjkdbhsgey,但也请不要这样命名您的结构。我们需要<T>告诉 Rust“这不是一个特定的类型名称;它是一个变量,我选择这样称呼它T”。