从函数[Rust]返回反向字符串

时间:2014-11-13 18:02:41

标签: rust lifetime

我希望编写一个可以反转字符串的函数,并返回对返回字符串的引用。我对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()
}

2 个答案:

答案 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的示例,假设您在原始字符串中有[éo],́附加到{{1} }}:e,但在撤消后,您会获得[éoó],其中e附加到́:{ {1}}。

后者非常复杂,因为即使忽略字素问题,在原地反转UTF-8也需要知道UTF-8以避免分割代码点。当然,可以简单地创建一个反转的o并将其复制到输入中......

编辑:我最初想过收集到中间人óe,但@AlexP意识到这是不必要的,可以直接收集到String

答案 1 :(得分:0)

该功能最终按预期运行:

fn reverse_string(input: &str) -> String {
    input.chars().rev().collect()
}