如何在迭代 &str 的 vec 时在 Rust 循环之外转移所有权?

问题描述 投票:0回答:1

我一直在解决一个简单的 codewars kata,你可以立即知道答案的那个,然而,1.5 小时后,Rust 中的借用检查器仍然打败了我 --.-- 因此,我来这里问关于所有权的另一个问题:)

假设任务是“给定一个

&str
的单词,返回一个字符串,其中每个单词被反转,保留单词顺序”.

天真的答案很简单:1)拆分你的字符串,2)遍历单词,3)反转每个单词,4)加入反转的单词。

但是当我做这样的事情时:

fn sentence_reverse(words: &str) -> String {
    let v:Vec<&str> = vec!();
    
    for w in words.split_whitespace() {
        v.push(&w.chars().rev().collect::<String>());
    }
    
    v.join(" ")
}

...我遇到了一个受伤的世界

基本上,尝试了几种变体(直接迭代

.split()
,将初始字符串隐藏为可变
let mut words:Vec<&str> = words.split().collect()
并通过索引对其进行迭代并将结果分配到位),我仍然遇到相同的问题:
 的结果w.chars().rev().collect()
只存在于
for
循环的范围内,因为它会产生一个
&str
,所以当我稍后尝试
v.join(" ")
时,借用检查器不会让我这样做(并且有充分的理由,我确定)。

在你告诉我“只是

.map()
它!”之前– 是的,当然我最后做到了
.map()
。问题的重点是了解,
.map()
如何处理它,如何在内部范围内获得
vec
&str
并成功将其传输到外部范围。

对不起,文字墙,非常感谢您的帮助。

rust borrow-checker ownership
1个回答
0
投票

无法编译的原因是您在循环内创建了一个

String
,并将对它的引用存储在
v
中。您不能将对循环内分配的
String
的引用存储到外部作用域中的变量中,因为
String
在每次迭代结束时被删除。您可以将
String
存储在
Vec<String>
中,然后您的函数会编译:

fn sentence_reverse(words: &str) -> String {
    let mut v: Vec<String> = vec![];

    for w in words.split_whitespace() {
        v.push(w.chars().rev().collect::<String>());
    }

    v.join(" ")
}
© www.soinside.com 2019 - 2024. All rights reserved.