这个解决方案似乎不太优雅:

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都会恰好返回两个结果,因此最好将元组直接分配给两个变量firstlast,而不是看似任意长度的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/

    10-15 12:18