函数 - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 函数

同样的规则也适用于函数：当类型 `T` 前面加上 `<T>` 时，它就变成了泛型。

使用泛型函数有时需要明确指定类型参数。这种情况可能出现在函数返回类型是泛型时，或者编译器没有足够信息推断必要的类型参数时。

明确指定类型参数的函数调用看起来像这样：`fun::<A, B, ...>()`。

    struct A;          // 具体类型 `A`
    struct S(A);       // 具体类型 `S`
    struct SGen<T>(T); // 泛型 `SGen`

    // 以下函数都获取传入变量的所有权
    // 并立即离开作用域，释放该变量

    // 定义函数 `reg_fn`，接受一个 `S` 类型的参数 `_s`
    // 由于没有 `<T>`，所以这不是泛型函数
    fn reg_fn(_s: S) {}

    // 定义函数 `gen_spec_t`，接受一个 `SGen<T>` 类型的参数 `_s`
    // 虽然明确给定了类型参数 `A`，但因为 `A` 并未被指定为
    // `gen_spec_t` 的泛型类型参数，所以这个函数不是泛型的
    fn gen_spec_t(_s: SGen<A>) {}

    // 定义函数 `gen_spec_i32`，接受一个 `SGen<i32>` 类型的参数 `_s`
    // 明确指定了类型参数 `i32`，这是一个具体类型
    // 由于 `i32` 不是泛型类型，所以这个函数也不是泛型的
    fn gen_spec_i32(_s: SGen<i32>) {}

    // 定义函数 `generic`，接受一个 `SGen<T>` 类型的参数 `_s`
    // 由于 `SGen<T>` 前面有 `<T>`，所以这个函数是关于 `T` 的泛型函数
    fn generic<T>(_s: SGen<T>) {}

    fn main() {
        // 使用非泛型函数
        reg_fn(S(A));          // 具体类型
        gen_spec_t(SGen(A));   // 隐式指定类型参数 `A`
        gen_spec_i32(SGen(6)); // 隐式指定类型参数 `i32`

        // 为 `generic()` 显式指定类型参数 `char`
        generic::<char>(SGen('a'));

        // 为 `generic()` 隐式指定类型参数 `char`
        generic(SGen('c'));
    }

### 另请参阅：

函数和`结构体`