【发布时间】:2022-10-02 22:54:10
【问题描述】:
我正在尝试更改我在 rust 书中实现的 minigrep 应用程序,使其也像真正的 grep 一样采用 stdin 输入。
我创建了一个小型辅助函数,它接受配置并决定(当前根据环境变量)是返回缓冲的读取器迭代器还是标准输入迭代器:
fn stdinOrFile(cfg: &Cfg) -> impl Iterator<Item = String> + \'_ {
if cfg.stdin {
return io::stdin().lines();
}
let file = File::open(cfg.path.clone()).unwrap();
let reader = BufReader::new(file);
return reader.lines();
}
意识到我在黑暗中用棍子戳,看来返回特征对象的语法is legal,现在认为这是一个死胡同。编译器似乎仍在尝试推断返回值的具体类型,并抱怨另一种类型不是同一类型,但据我所知,它们都实现了迭代器特征。
我必须解决的一些想法:
-
Box返回前的值 - 创建一个通用包装器来包装这两种底层类型,然后,由于
minigrep匹配器只使用迭代器的filter功能,我可以根据它的底层类型在包装器上分别实现filter持有,然后将调用基础类型的相关方法。有任何想法吗? 如果推断出具体实现,为什么返回类型中允许使用特征对象语法?