这个解决方案看起来相当不优雅:
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()
}
我建议返回 Result<Vec<u8>, Error>
而不是 panic expect/unwrap
.
夜间实现
我的下一个想法是关于第二个系列。这是一个使用夜间代码的代码示例,但您根本不需要任何收集。
#![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/