如何使用生命周期名称参数化的特征边界声明泛型函数?

Tob*_*ann 4 generics traits lifetime rust

给定一个通用函数:

fn foo<T> (_x: T) {}
Run Code Online (Sandbox Code Playgroud)

我想添加一个serde::Deserializetrait bound。然而以下

fn foo<T: serde::Deserialize> (_x: T) {}
Run Code Online (Sandbox Code Playgroud)

结果是

fn foo<T> (_x: T) {}
Run Code Online (Sandbox Code Playgroud)

并尝试像我了解有关反序列化器生命周期的 serde 文档一样

fn foo<'de, T> where T: serde::Deserialize<'de> (_x: T) {}
Run Code Online (Sandbox Code Playgroud)

也会产生错误:

fn foo<T: serde::Deserialize> (_x: T) {}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Tob*_*ann 5

Oh, it was just a basic error in the function syntax.

fn foo<'de, T>(_x: T)
where
    T: serde::Deserialize<'de>,
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

is correct and works.

  • @Shepmaster 是的,谢谢。这样更简洁。这可能不是这里的理想场所,但我也想在更广泛的范围内说声谢谢。当我偶尔遇到一些生锈的问题时,我在互联网上找到的答案很可能是您发布的。无论如何,您在 stackoverflow 上的工作都非常出色。 (6认同)
  • 或者 `fn foo&lt;'de, T: serde::Deserialize&lt;'de&gt;&gt; (_x: T) {}` (3认同)