【发布时间】:2023-03-31 02:33:02
【问题描述】:
我正在学习 rust 并遇到了问题。我有这个 MCVE:
fn main() {
let mut line = String::new();
std::io::stdin()
.read_line(&mut line)
.expect("Failed to read line");
handle_tokens( line.split_ascii_whitespace() );
}
fn handle_tokens( mut it: std::str::SplitAsciiWhitespace ) {
loop {
match it.next() {
None => return,
Some(s) => println!("{}",s),
}
}
}
String::split_ascii_whitespace 返回一个SplitAsciiWhitespace 对象,所以我在handle_tokens 的签名中使用了它,但std::str::SplitAsciiWhitespace 是一个非常特殊的类型。字符串列表的通用迭代器更有意义,因此我可以选择 split_whitespace 或者只是通用字符串列表。
如何使用文档或编译器错误来概括handle_tokens 的签名?
这是我自己回答问题的失败尝试:
我可以看到SplitAsciiWhitespace“Trait Implementations”包括:
impl<'a> Iterator for SplitWhitespace<'a>
这就是next() 的来源(我必须检查源代码来验证这一点)。因此,我尝试使用带有 fn handle_tokens( mut it: Iterator ) { 的迭代器,但是:
error[E0191]: the value of the associated type `Item` (from trait `std::iter::Iterator`) must be specified
--> src/main.rs:10:27
|
10 | fn handle_tokens( mut it: Iterator ) {
| ^^^^^^^^ help: specify the associated type: `Iterator<Item = Type>`
好的,所以Iterator 太通用了,无法使用...我需要告诉编译器它在包装什么。这是有道理的,否则我将无法取消引用它。我不得不再次查看source code 以了解SplitWhitespace 如何实现迭代器并看到type Item = &'a str; 所以我尝试用fn handle_tokens( mut it: Iterator<Item = &str>) 指定Item,但是:
error[E0277]: the size for values of type `(dyn std::iter::Iterator<Item = &str> + 'static)` cannot be known at compilation time
--> src/main.rs:10:19
|
10 | fn handle_tokens( mut it: Iterator<Item = &str> ) {
| ^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `(dyn std::iter::Iterator<Item = &str> + 'static)`
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= note: all local variables must have a statically known size
= help: unsized locals are gated as an unstable feature
好的,所以我还需要指定一个尺寸。这很奇怪,因为虽然我知道 str 的大小在编译时无法知道,但 &str 的大小应该是。
在这一点上,我很困惑。当 Rust 似乎提供了如此出色的内置文档支持时,源代码检查是必要的,我也很惊讶。这让我觉得我用来回答这个问题的方法是错误的。
【问题讨论】:
-
在我(初学者)的水平上,很难理解这个答案。我确定这没有错,但添加
whereIntoIterator和Borrow还不是我要做的。 @Kitsu 的回答很明确。
标签: rust