我想编写一个函数,该函数将反转字符串并返回对返回的字符串的引用。我以为我可以指定返回的引用与提供的引用具有相同的生存期。
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)
我以为类型规范可以解决这个问题。生命对我来说有些混乱,所以我希望有人能够解释如何正确执行此操作,或者我是否一开始就完全不了解。
生存期问题类似于&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。
| 归档时间: |
|
| 查看次数: |
794 次 |
| 最近记录: |