如何解决解开跳过的Chars迭代器
许多迭代器方法是Rust生成的迭代器,这些迭代器包装在迭代器中。一种这样的情况是skip
方法,该方法跳过给定数量的元素,并产生包装在实现Skip
特性的Iterator
结构中的其余元素。
我想逐行读取文件,有时会跳过一行的n
首个字符。我认为使用Iterator.skip
是可行的,但是现在我不得不弄清楚如何真正解开产生的Chars
迭代器,以便可以用&str
实现其余的chars.as_str()
在rust中展开迭代器的惯用方式是什么?通话链
let line: &String = ...;
let remaining = line.chars().skip(n).as_str().trim();
引发错误
error[E0599]: no method named `as_str` found for struct `std::iter::Skip<std::str::Chars<'_>>` in the current scope
--> src/parser/directive_parsers.rs:367:63
|
367 | let option_val = line.chars().skip(option_val_indent).as_str().trim();
| ^^^^^^ method not found in `std::iter::Skip<std::str::Chars<'_>>`
error: aborting due to previous error
解决方法
您可以使用chars
来查找要从字符串中获取切片的确切点,而不是遍历char_indices
,以确保您不会索引到多行的中间字节字符。这将节省迭代器中每行的分配:
input
.iter()
.map(|line| {
let n = 2; // get n from somewhere?
let (index,_) = line.char_indices().nth(n).unwrap();// better error handling
&line[index..]
})
,
您可以使用字符串的nth()
迭代器上的char_indices()
方法来检索第n个字符的起始字节索引。一旦有了此字节索引,就可以使用它来获取原始字符串的子片段:
let line = "This is a line.";
let index = line.char_indices().nth(n).unwrap().0;
let remaining = &line[index..];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。