- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做这样的事情:
let count = self.line_current[self.line_current_pos..]
.split(self.separator)
.take(i_count)
.map(|s|if s.is_empty() { Ok(()) } else { Err(s) })
.count()?;
if count != i_count {
Err("Unexpected newline")
} else {
Ok(())
}
这是面向行的解析函数,它会跳过预期数量的分隔符。
然而,迭代器上的 count() 函数会消耗迭代器并且不能与 std::ops::Try 一起使用。有没有一种优雅的方法来计算有效项目,但如果其中一个项目不符合条件则立即返回错误?
最佳答案
假设您要解析 "field1,field2,A,B,C"
形式的字符串- 所以开头有一些你想跳过的垃圾字段(在这种情况下是 2 个),但你也希望它后面有 3 个标记 - 如果存在的字段少于 3 个,你想出错。
此类函数的签名如下所示:
fn parse(line: &str, skip: usize, count: usize) -> Result<Vec<Token>, Error>
在这种情况下,我们会调用 parse("field1,field2,A,B,C", 2, 3)
.
所以我们首先将字符串拆分为 ','
:
line.split(',')
我们跳过skip
字段:
.skip(skip)
我们尝试解析每个字段
.map(str::parse)
现在是优雅的技巧 - 将一个元素附加到迭代器的末尾,如果我们到达它就会导致错误。我们使用 Iterator::chain
与 Some(T)
- Some(T)
在这种情况下,其功能类似于一个元素的迭代器。
.chain(Some(Err(Error::NotEnoughTokens)))
不管我们需要多少元素
.take(count)
将整个东西收集到 Result<Vec<Token>, Error>
中- 这很管用!返回的错误将是第一个遇到的,所以首先遇到任何解析错误,然后是 NotEnoughTokens
错误。
.collect()
使用它的完整代码,包括 token 解析样板,如下所示:
use std::str::FromStr;
#[derive(Debug)]
enum Token {
A,
B,
C,
}
#[derive(Debug)]
enum Error {
NotEnoughTokens,
InvalidToken,
}
impl FromStr for Token {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Error> {
match s {
"A" => Ok(Token::A),
"B" => Ok(Token::B),
"C" => Ok(Token::C),
_ => Err(Error::InvalidToken),
}
}
}
fn parse(line: &str, skip: usize, count: usize) -> Result<Vec<Token>, Error> {
line.split(',')
.skip(skip)
.map(str::parse)
.chain(Some(Err(Error::NotEnoughTokens)))
.take(count)
.collect()
}
fn main() {
println!("{:?}", parse("A,B,C", 0, 2)); // Ok([A, B])
println!("{:?}", parse("A,B,C", 0, 3)); // Ok([A, B, C])
println!("{:?}", parse("A,B,C", 0, 4)); // Err(NotEnoughTokens)
println!("{:?}", parse("A,B,C,D", 0, 4)); // Err(InvalidToken)
println!("{:?}", parse("field1,B,C", 1, 2)); // Ok([B, C])
println!("{:?}", parse("field1,field2,C", 2, 1)); // Ok([C])
println!("{:?}", parse("field1,B,C", 2, 2)); // Err(NotEnoughTokens)
println!("{:?}", parse("f1,f2,f3,A", 3, 1)); // Ok([A])
}
关于rust - 在迭代器上使用 count() -> Result<usize> 函数的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126772/
我正在尝试在 Rust 中实现冒泡排序算法,但我遇到了类型不匹配错误。有人可以帮助实现吗? 此外,它的实现方式与我在 Python 中实现的方式相同。我确信有一种朴素的方法可以实现这一点。 fn ma
我有一些代码看起来有点像下面这样: let incoming: Vec = Vec::new(); match some_function(|data| { let temp = &mut i
我为 Exercism 做的练习(minesweeper 任务),我需要将 usize 转换为 char 以便将其插入到 std::string::String. 用最少的代码行描述问题: let m
此代码编译: fn main() { let mut s = String::from("some_string"); let n = f1(&s); s.clear();
我有一个二维向量拒绝使用 i32 进行索引值,但如果我使用 as usize 转换这些值,则有效: #[derive(Clone)] struct Color; struct Pixel {
我正在尝试编译一些较旧的 Rust 代码,在这段代码上: const SOMETHING: *const c_char = -1 as *const c_char; 我收到这个错误: error: c
我在 Rust 中有这个功能: fn printboard(board: Vec) { println!("| |{:>2$} {:>2$} {:>2$} {:>2$} {:>2$} {:>
我有一个基于usize输入返回compound duration的函数: pub fn format_dhms(seconds: usize) -> String 如果输入是6000000: prin
假设我有素数和幂的向量: let mut primes: Vec = ...; let mut powers: Vec = ...; 事实是primes.len() == powers.len() .
我有一个 let mut stack: Vec = vec![5, 7, 1]长短不一。在程序的某个时刻,我想增加 stack 的最后一个元素。一个。我试过 stack.last_mut().unwr
有时索引需要紧密打包(例如网格几何),将索引存储为 u32 而不是 usize 很有用。 有没有办法在 Rust 中索引一个向量,而不必每次都显式转换为 usize?例如: vector[some_u
我正在研究 Rust 中的一些编码挑战,其中一个问题是确定一个短语是否是全字母组合。我看到了以下实现: // Copy chars into a vector, sort and remove dup
文档说 usize 是 Operations and constants for pointer-sized unsigned integers. 在大多数情况下,我可以将 usize 替换为 u32
This code works and prints "b":此代码工作并打印“b”: fn main() { let s = "abc";
下面是测试代码: pub fn reverse_complement_seq_u8(seq: T, len: usize) -> Vec where T: std::ops::Index {
我正在学习 Rust 并阅读文档,这时我偶然发现了 isize 和 usize 数据类型。文档中提到了以下内容: The primary situation in which you’d use is
我正在尝试用 Rust 实现快速排序算法,问题是,我有一个名为 'i' 的变量,用作迭代器,但起初,它的值为 '- 1',我不能将它设置为 usize 类型,因为它是负数,但我也不能将它设置为 isi
我正在尝试用 Rust 实现快速排序算法,问题是,我有一个名为 'i' 的变量,用作迭代器,但起初,它的值为 '- 1',我不能将它设置为 usize 类型,因为它是负数,但我也不能将它设置为 isi
isize 和 usize 可以不同吗?它们都可以用于内存大小、索引、偏移量。 因为 usize 用于数组,为什么我们不只使用 usize 我是 Rust 的新手,所以这可能是一个基本问题。 更新:在
我正在做一个(可能不好的)排序算法作为练习实验。 我正在尝试获取一个未排序的 i32 列表,其中包含重复项,将其分解为一个已排序数组(各种大小)的数组,然后我可以将其有效地重新组合成一个完全排序的数组
我是一名优秀的程序员,十分优秀!