这个解决方案似乎不太优雅:
fn parse_range(&self, string_value: &str) -> Vec<u8> {
let values: Vec<u8> = string_value
.splitn(2, "-")
.map(|part| part.parse().ok().unwrap())
.collect();
{ values[0]..(values[1] + 1) }.collect()
}
splitn(2, "-")
对于任何有效的string_value
都会恰好返回两个结果,因此最好将元组直接分配给两个变量first
和last
,而不是看似任意长度的Vec
。我似乎无法用元组来做到这一点。 collect()
的两个实例,我想知道它是否可以减少为一(甚至为零)。 最佳答案
琐碎的实现
fn parse_range(string_value: &str) -> Vec<u8> {
let pos = string_value.find(|c| c == '-').expect("No valid string");
let (first, second) = string_value.split_at(pos);
let first: u8 = first.parse().expect("Not a number");
let second: u8 = second[1..].parse().expect("Not a number");
{ first..second + 1 }.collect()
}
Playground
我建议您返回
Result<Vec<u8>, Error>
,而不要对expect/unwrap
panic 。每晚执行
我的下一个想法是关于第二次收藏。这是一个使用每晚代码的代码示例,但是您根本不需要任何收集。
#![feature(conservative_impl_trait, inclusive_range_syntax)]
fn parse_range(string_value: &str) -> impl Iterator<Item = u8> {
let pos = string_value.find(|c| c == '-').expect("No valid string");
let (first, second) = string_value.split_at(pos);
let first: u8 = first.parse().expect("Not a number");
let second: u8 = second[1..].parse().expect("Not a number");
first..=second
}
fn main() {
println!("{:?}", parse_range("3-7").collect::<Vec<u8>>());
}
关于rust - 如何将 “x-y”转换为vec![x,x + 1,…y-1,y]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49164470/