【问题标题】:How to declare a generic function with a trait bound that is parameterized with a lifetime name?如何声明具有使用生命周期名称参数化的特征绑定的通用函数?
【发布时间】:2018-12-12 15:29:22
【问题描述】:

给定一个通用函数:

fn foo<T> (_x: T) {}

我想添加一个 serde::Deserialize 特征绑定。但是以下

fn foo<T: serde::Deserialize> (_x: T) {}

结果

error[E0637]: `&` without an explicit lifetime name cannot be used here
 --> src/lib.rs:1:11
  |
1 | fn foo<T: serde::Deserialize> (_x: T) {}
  |           ^^^^^^^^^^^^^^^^^^ explicit lifetime name needed here

像我理解的那样尝试它the serde documentation regarding deserializer lifetimes

fn foo<'de, T> where T: serde::Deserialize<'de> (_x: T) {}

也会产生错误:

error: expected `(`, found `where`
 --> src/lib.rs:1:16
  |
1 | fn foo<'de, T> where T: serde::Deserialize<'de> (_x: T) {}
  |                ^^^^^ expected `(`

我做错了什么?

【问题讨论】:

标签: generics rust traits lifetime


【解决方案1】:

哦,这只是函数语法中的一个基本错误。

fn foo<'de, T>(_x: T)
where
    T: serde::Deserialize<'de>,
{
    // ...
}

正确且有效。

【讨论】:

  • fn foo&lt;'de, T: serde::Deserialize&lt;'de&gt;&gt; (_x: T) {}
  • @Shepmaster 是的,谢谢。这样更简洁。这可能不是这里理想的地方,但我也想在更广泛的范围内说谢谢。当我偶尔遇到一些生锈的问题时,我在 Internet 上某个地方找到的答案很可能是您发布的。无论如何,您在 stackoverflow 上的工作非常出色。
  • 我自己更喜欢 where 子句,因为我发现它更容易阅读,尽管流行的 rustfmt 风格是将它放在多行上(我已经更新了答案)。感谢您花时间认识那些帮助过您的人;我们真的很感激(与我们经常收到的其他反馈相比,这是一个很好的变化^_^)
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2021-12-17
相关资源
最近更新 更多