【问题标题】:How do I set the return value's lifetime? [closed]如何设置返回值的生命周期? [关闭]
【发布时间】:2018-09-09 22:28:18
【问题描述】:

我有以下方法来检查String ID 是否存在。如果没有,生成然后返回它:

fn generate_id(&self) -> ID<'m> {
    let id = nanoid::generate(15);
    while self[&id].is_some() {
        id = nanoid::generate(15);
    };
    id
}

ID 是一个类型别名:type ID&lt;'id&gt; = &amp;'id String;

返回值必须是&amp;'m std::string::String,但idstd::string::String

我已经尝试过:

let id: ID<'m> = nanoid::generate(15);

但它给出的错误与该方法仅针对id 给出的错误相同。

【问题讨论】:

  • 请提供minimal reproducible example。我们不知道nanoid::generate 的签名是什么,也不知道self[] 的实现对于呈现的代码是什么。

标签: rust lifetime


【解决方案1】:

生命周期是描述性的,而不是规定性的。你不设置生命周期;它们是您编写的程序的结果。

您正试图返回对局部变量的引用。那是无效的,并且没有你可以写的生命周期来使它有效。

您遇到了 X/Y 问题。真正的问题是为什么你觉得有必要返回一个参考。

【讨论】:

  • 我同意您的观点,但是(大概)OP 解决了他们的问题,因为他们回答了,即使您和我都同意根据所提供的信息这是不可能的。这个问题感觉像是无法回答的(或者是什么东西的欺骗)。
  • 我对术语“临时”也有一点小问题。临时将是String::new().trim() 中的String;这只是一个局部变量。
  • 关于临时的好点。我仍然认为我的回答对其他读者很重要,仅仅是因为 OP 的自我回答毫无意义。
【解决方案2】:

您需要关注变量的设置位置,而不是实际返回变量的位置。

在这种情况下,将nanoid::generate(15); 更改为&amp;nanoid::generate(15);

fn generate_id(&self) -> ID<'m> {
    let id: ID<'m> = &nanoid::generate(15);
    while self[&id].is_some() {
        id = &nanoid::generate(15);
    };
    id
}

这可确保变量的初始类型具有生命周期,并将值作为引用提供可确保变量具有正确的生命周期。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2018-09-22
  • 2021-05-31
  • 2013-02-06
  • 2021-09-13
  • 2021-10-25
相关资源
最近更新 更多