说我有一个功能
fn process_graph_nodes(graph: Graph, nodes: Option<impl Iterator<Item=Node>){
for node in nodes.unwrap_or_else(|| graph.all_nodes()) {
//processing node
}
}
方法all_nodes
返回一些实现Iterator<Item=Node>
的类型。因此,nodes.unwrap()
和graph.all_nodes()
都返回产生Node
类型的迭代器,但它们是不同的类型,导致编译错误的原因。
有没有办法让代码编译,可能是通过将两种类型转换为Iterator<Item=Node>
的特征对象?
我想我会定义一个内部函数并手动调度:
fn process_graph_nodes(graph: Graph, nodes: Option<impl Iterator<Item=Node>){
fn process_internal(graph: Graph, nodes: impl Iterator<Item=Node>) {
for node in nodes {
//processing node
}
}
match nodes {
None => process_internal(graph, graph.all_nodes()),
Some(n) => process_internal(graph, n),
}
}
(我手边没有编译器,但我认为你可以得到这个想法。)
这样,您就可以避免使用Either
的潜在成本。