Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何从函数返回反向字符串?_Rust_Lifetime - Fatal编程技术网

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

Rust 如何从函数返回反向字符串?,rust,lifetime,Rust,Lifetime,我想写一个函数,它将反转字符串并返回对返回字符串的引用。我想我可以指定返回的引用与提供的引用具有相同的生存期 fn reverse_string<'a>(input: &'a str) -> &'a str { let res: &'a str = input.chars().rev().collect().as_slice(); res } 我认为类型规范可以解决这个问题。生命周期对我来说有点困惑,所以我希望有人能够解释如何正确地做到

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

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

我认为类型规范可以解决这个问题。生命周期对我来说有点困惑,所以我希望有人能够解释如何正确地做到这一点,或者如果我一开始就完全偏离了基准。

生命周期问题类似于:如果你创建一个新对象,它就是一个新对象,与旧对象无关

因此,您有两种选择:

  • 创建一个全新的对象:
    input.chars().rev().collect()
  • 或者将
    输入
    反转到位,这当然要求它是
    mut
前者看起来很简单:

然而,这样创建的
字符串
可能有“缺陷”,因为
char
(中间类型)只是Unicode码点,而不是字符集。例如,假设您在原始字符串中有[
e
o
],将
附加到
e
o
,但在反转后,您得到[
o
e
,其中
附加到
o

后一种情况非常复杂,因为即使忽略了字形问题,逆转UTF-8也需要了解UTF-8以避免分割代码点。当然,可以简单地创建一个反向的
字符串
,并将其复制到输入中


编辑:我最初想收集到一个中介
Vec
,但@AlexP意识到这是不必要的,可以直接收集到
字符串中,该函数最终按预期运行:

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

谢谢你的帮助!但是,当尝试使用rust 0.12.0-dev编译上述代码段时,我收到错误“此值的类型需要在此上下文中已知”,并指示部分“v.as_slice()”(哎呀,错过了编辑窗口),我想知道返回引用的生存期是什么?实际上,我不确定返回引用如何处理借用等问题,我在文档中找不到任何相关内容。@AlexP:如果引用是在函数中创建的,则无法从函数返回引用,因为当函数退出时,该值将被销毁,且引用将悬空。通过返回一个
字符串
,您将返回一个拥有该字符串内容的值,因此不涉及借用。谢谢@FrancisGagné,非常感谢您的帮助。:)设法解决了我的问题。@AlexP:你需要
collect
的注释吗?如果需要,您可以使用
let v:Vec=
收集::()
fn reverse_string(input: &str) -> String {
    input.chars().rev().collect()
}