你能在Rust中将一个变量移到更高的范围吗



刚刚开始学习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()
}

最新更新