rust - 如何将 "x-y"翻译成 vec![x, x+1, … y-1, y]?

标签 rust readability

这个解决方案看起来相当不优雅:

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>而不是 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/

相关文章:

variables - 为什么修改未声明为可变的变量时编译器不报错?

c# - 如何在 C# 中的每个数学函数前面避免 "Math."?

java - Java 中的 System.out.println() 与\n

embedded - 未知的 BlueNRG SPI 响应

rust - 特征可以为其继承的特征的方法提供默认实现吗?

rust - 将所有权移至 std::io::Chain

pointers - 我可以返回一个结构,该结构使用特征实现中的 PhantomData 来为原始指针添加生命周期而不污染接口(interface)吗?

javascript - 处理长 write() 参数的最佳方法是什么?

Kotlin 使用 lambda 作为初始化器

Java try/catch 性能,是否建议将 try 子句中的内容保持在最低限度?