如何从函数返回反向字符串?

Ale*_*x P 2 lifetime rust

我想编写一个函数,该函数将反转字符串并返回对返回的字符串的引用。我以为我可以指定返回的引用与提供的引用具有相同的生存期。

fn reverse_string<'a>(input: &'a str) -> &'a str {
    let res: &'a str = input.chars().rev().collect().as_slice();
    res
}
Run Code Online (Sandbox Code Playgroud)

这是我的尝试,并且收到错误消息:

fn reverse_string<'a>(input: &'a str) -> &'a str {
    let res: &'a str = input.chars().rev().collect().as_slice();
    res
}
Run Code Online (Sandbox Code Playgroud)

我以为类型规范可以解决这个问题。生命对我来说有些混乱,所以我希望有人能够解释如何正确执行此操作,或者我是否一开始就完全不了解。

Mat*_* M. 5

生存期问题类似于&str的生存期,使得比较比较困难:如果创建一个对象,则它是一个新对象,与旧对象无关。

因此,您有两种选择:

  • 要么创建一个全新的对象:input.chars().rev().collect()例如
  • input 就地反转,这mut当然需要

前者看起来很简单:

fn reverse_new(input: &str) -> String {
    input.chars().rev().collect()
}
Run Code Online (Sandbox Code Playgroud)

但是,String这样创建的文件可能是“有缺陷的”,因为char(中间类型)只是Unicode代码点而不是字素。作为一个例子组合字符想象一下,你有[ e?o在原始字符串时,?连接到eéo,但反转之后你[ o?e]其中?连接到oóe

后者使事实变得非常复杂,因为即使忽略字素问题,就地逆转UTF-8也需要知道UTF-8,以避免分裂代码点。当然,可以简单地创建一个反向String并将其复制到输入中...

编辑:我起初曾考虑过要收集到一个中介中Vec,但是@AlexP意识到这是不必要的,可以直接收集到一个中String