刚刚开始学习Rust,下面的片段是我正在尝试解决的Codewars培训。我正在尝试将一个变量移动到for num in nums { }
作用域之外。价值观还不够长久,这一点我可以理解。但是如何修复呢?克隆不起作用。
fn is_sum_of_cubes(s: &str) -> String {
let nums = s.split(|x: char| !x.is_numeric())
.filter(|x| !x.is_empty())
.collect::<Vec<_>>();
let mut s: Vec<&str> = Vec::new();
for num in nums {
let ch = num.chars()
.collect::<Vec<char>>();
let chunk = ch.chunks(3)
.map(|c| c.iter().collect::<String>())
.collect::<Vec<String>>()
.join(" ");
let spl = chunk.split_ascii_whitespace()
.collect::<Vec<_>>();
println!("spl: {:?}", &spl);
s = spl.clone();
}
println!("chunks: {:?}", s);
"Oeps".to_owned()
}
Compiling rust v0.1.0 (/Users/m.h.doornekamp/tmp/rust)
error[E0597]: `chunk` does not live long enough
--> src/main.rs:18:15
|
18 | let spl = chunk.split_ascii_whitespace()
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ borrowed value does not live long enough
...
23 | }
| - `chunk` dropped here while still borrowed
24 |
25 | println!("chunks: {:?}", s);
| - borrow later used here
将变量s
声明为String
的向量,而不是字符串切片。String
是所拥有的数据类型,而字符串切片是引用。
在代码中执行以下两项更改,应该可以了。
let mut s: Vec<String> = Vec::new();
然后在环路内部-
s = chunk.split_ascii_whitespace().collect::<Vec<_>>();
此外,您可能可以将这两个步骤结合起来,而不是.join(" ")
和.split_ascii_whitespace()
。这将是另一个更好的优化。
感谢您的建议。这很有帮助。这就是我解决问题的方法。
fn is_sum_of_cubes(s: &str) -> String {
// extract the numbers from string slice s
let nums = s.split(|x: char| !x.is_numeric())
.filter(|x| !x.is_empty())
.collect::<Vec<_>>();
// split the numbers in groups of 3 digits
let mut arr: Vec<String> = Vec::new();
for num in &nums {
// make chunks of 3 digits
let chunk = num.chars()
.collect::<Vec<char>>()
.chunks(3)
.map(|c| c.iter().collect::<String>())
.collect::<Vec<String>>()
.join(" ");
// add each chunk to the array
arr.append(&mut chunk.split_ascii_whitespace()
.collect::<Vec<_>>()
.iter()
.map(|x| x.to_string())
.collect());
}
println!("nums: {:?}", &nums);
println!("chunks: {:?}", &arr);
"Oeps".to_owned()
}