我希望编写一个可以反转字符串的函数,并返回对返回字符串的引用。我对Rust非常(非常)新,所以这可能有点幼稚,但我想我可以指定返回的引用与提供的引用具有相同的生命周期。
fn reverse_string<'a>(input : &'a str) -> &'a str {
let res :&'a str = input.chars().rev().collect().as_slice(); res
}
这是我的尝试,并且在尝试编译时收到错误“此值的类型必须在此上下文中已知”,尽管我认为类型规范将解决此问题。一生对我来说有点混乱,所以我希望有人能够解释如何正确地做到这一点,或者如果我完全偏离基础开始。
提前感谢您的帮助:)
编辑:
最终按预期运作的功能
fn reverse_string(input: &str) -> String {
input.chars().rev().collect()
}
答案 0 :(得分:4)
终身问题类似于The lifetime of &str makes comparison hard:如果你创建一个 new 对象,它就是一个与旧对象不相关的新对象。
因此,您有两种选择:
input.chars().rev().collect()
,例如input
就地,当然需要mut
前看起来很容易:
fn reverse_new(input: &str) -> String {
input.chars().rev().collect()
}
但是这样创建的String
可能是“有缺陷的”,因为char
(中间类型)只是Unicode代码点而不是字形。作为Combining Characters的示例,假设您在原始字符串中有[e
,́
,o
],́
附加到{{1} }}:e
,但在撤消后,您会获得[éo
,o
,́
],其中e
附加到́
:{ {1}}。
后者非常复杂,因为即使忽略字素问题,在原地反转UTF-8也需要知道UTF-8以避免分割代码点。当然,可以简单地创建一个反转的o
并将其复制到输入中......
编辑:我最初想过收集到中间人óe
,但@AlexP意识到这是不必要的,可以直接收集到String
。
答案 1 :(得分:0)
该功能最终按预期运行:
fn reverse_string(input: &str) -> String {
input.chars().rev().collect()
}