rust 了解相依存留期

zbdgwd5y  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(117)

如何告诉编译器一个生存期必须比另一个生存期长?

  1. use serde::{Deserialize, Serialize};
  2. # [derive(Serialize, Deserialize, Debug)]
  3. pub struct Tokens<'a> {
  4. buffer: String,
  5. list: Vec<Token<'a>>,
  6. }
  7. # [derive(Serialize, Deserialize, Debug)]
  8. pub struct Token<'a> {
  9. term: &'a str,
  10. }

收益率

  1. error: lifetime may not live long enough
  2. --> src/pipeline/tokenizers/test.rs:6:5
  3. |
  4. 3 | #[derive(Serialize, Deserialize, Debug)]
  5. | ----------- lifetime `'de` defined here
  6. 4 | pub struct Tokens<'a> {
  7. | -- lifetime `'a` defined here
  8. 5 | buffer: String,
  9. 6 | list: Vec<Token<'a>>,
  10. | ^^^^ requires that `'de` must outlive `'a`
  11. |
  12. = help: consider adding the following bound: `'de: 'a`

在上面的代码中,token.term:&str将始终引用tokens.buffer的切片。我不确定如何指定该关系。我也不确定如何添加请求的绑定。
如果可以,那么神奇的语法是什么呢?

weylhg0b

weylhg0b1#

你不能给derive实现添加约束。你 * 可以 * 自己编写整个Deserialize实现,并把约束放在通常的地方。但幸运的是,serde想到了这个用例。如果你向serde指示数据应该 * 从 * 反序列化器借用,它会为你把约束放在里面。

  1. # [derive(Serialize, Deserialize, Debug)]
  2. pub struct Tokens<'a> {
  3. buffer: String,
  4. #[serde(borrow)]
  5. list: Vec<Token<'a>>,
  6. }
t3psigkw

t3psigkw2#

您可以使用属性#[serde(borrow)],让产生的Deserialize实作借用数据。

  1. use serde::{Deserialize, Serialize};
  2. # [derive(Serialize, Deserialize, Debug)]
  3. pub struct Tokens<'a> {
  4. buffer: String,
  5. #[serde(borrow)]
  6. list: Vec<Token<'a>>,
  7. }
  8. # [derive(Serialize, Deserialize, Debug)]
  9. pub struct Token<'a> {
  10. term: &'a str,
  11. }

请参阅:

  • 在派生实现中借用数据
  • Serde字段属性(借用)
展开查看全部

相关问题