gpt4 book ai didi

rust - 为什么我不能返回从字符串生成的 &str 值?

转载 作者:行者123 更新时间:2023-11-29 07:43:11 24 4
gpt4 key购买 nike

我在尝试理解为什么我无法返回从 String 生成的 &str 值时遇到了一些麻烦(天啊,什么时候 as_str 准备好了吗?)我做错了什么。我之所以有这个想法,是因为我所做的任何事情都无法使值(value)足够长的时间来使用。

我正在尝试为自定义结构实现 error::Error:

impl error::Error for LexicalError {
fn description(&self) -> &str {
let s = format!("{}", self);

// s doesn't live long enough to do this, I've tried
// cloning s and using that, but still the clone doesn't
// live long enough.
s.trim()
}

fn cause(&self) -> Option<&error::Error> {
None
}
}

(对于完整的片段,这里是 playpen )

我不知道如何从 description 返回 &str,我想重用 Display 逻辑,除非我完全误解了什么description 应该返回(可能是问题的简短描述)。要么,我在 format!(...) 的返回中遇到了同样的问题,这是一个我似乎无法活到足够长的时间以对我有用的变量。

最佳答案

首先,让我们看看实际预期的生命周期是多少。 description 的签名中有一个隐含的生命周期:

fn description(&self) -> &str
// Can be rewritten as
fn description<'a>(&'a self) -> &'a str

返回的指针必须至少与 self 一样有效。现在考虑 s。它将包含一个 String,一个拥有的字符串,并且它在函数结束时超出范围。返回&s是无效的,因为函数返回时s已经没有了。 trim 返回借用 s 的字符串切片,但切片再次仅在 s 有效时有效。

您需要返回一个比方法调用还长的字符串切片,因此这排除了堆栈上的任何内容。如果您可以自由选择返回类型,解决方案是将字符串移出函数。为此,需要一个拥有的字符串,然后返回类型将是 String,而不是 &str。遗憾的是,您无法在此处自由选择返回类型。

要返回一个比方法调用还长的字符串切片,我看到两个选项:

  1. 使用 &'static 字符串切片。这肯定会超过调用,但它需要在编译时知道该字符串。字符串文字的类型为 &'static str。如果描述不包含任何动态数据,这是一个合适的选项。

  2. 将拥有的字符串存储在 LexicalError 本身中。这确保您可以返回指向它的指针,该指针在 self 的整个生命周期内都有效。您可以在 LexicalError 中添加一个字段 desc: String 并在构造错误时进行格式化。然后该方法将实现为

    fn description(&self) -> &str {
    &self.desc
    }

    为了重复使用,可以让Display写入相同的字符串。

根据documentation of Error , Display 可用于提供额外的细节。如果您希望在错误中包含动态数据,那么 Display 是格式化它的好地方,但您可以省略它作为 description。这将允许使用第一种方法。

关于rust - 为什么我不能返回从字符串生成的 &str 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com