理想情况下我喜欢以下内容:
iter = if go_up {
(min .. limit)
} else {
(limit .. max).rev()
};
根据情况创建一个向上或向下计数到某个限制的迭代器。但是,由于Range
和Rev
是不同的类型,我无法做到这一点。我可以使用step_by
功能,但由于我的限制是无符号数据类型,因此我还必须投射所有内容。我到目前为止最好的是:
#![feature(step_by)]
iter = if go_up {
(min as i64 .. limit as i64).step_by(1)
} else {
(limit as i64 .. max as i64).step_by(-1)
};
但是这需要不稳定的功能,并且需要我的类型。似乎应该有一个更简洁的方法来做到这一点;有谁知道吗?
答案 0 :(得分:2)
就个人而言,你的解决方案
iter = if go_up {
(min as i64 .. limit as i64).step_by(1)
} else {
(limit as i64 .. max as i64).step_by(-1)
};
是比Shepmaster的第一个例子更好的选择,因为它更完整(例如,有size_hint
),它更可能是正确的作为一种标准工具,它的写作速度更快。
这是不稳定的,但是在此期间没有什么可以阻止你复制the source。这为您提供了一个很好的升级途径,以便最终实现稳定。
enum
封装技术在更复杂的情况下很棒,但在这种情况下,我很想接受KISS。