Vec { let values: Vec = string_valu-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:02:53 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com