2个稳定版本
1.0.1 | 2024年1月25日 |
---|---|
1.0.0 | 2023年8月13日 |
#252 in 调试
每月41次下载
在 yash-cli 中使用
11KB
130 行
融合迭代器
fuzed-iterator
是一个Rust库包,它提供了一个简单的迭代器包装器,如果迭代器在返回 None
后再次使用,将引发panic。
许多 std
中的迭代器实现了 FusedIterator
特性,该特性保证迭代器在返回 None
后不会再返回 Some
。这可能导致程序员错误地假设任何迭代器都像 FusedIterator
一样工作,当使用非融合迭代器时可能导致bug。
此包提供的 Fuze
包装器可以用于包装任何迭代器,如果迭代器在第一次返回 None
后再次使用,将引发panic。这可以用于捕获在预期融合迭代器的上下文中使用非融合迭代器的bug。在您的单元测试(或集成测试)中,将迭代器通过 Fuze
传递给期望迭代器(不一定是融合迭代器)的函数,如果函数过度调用 Iterator::next
,则测试将引发panic。
示例
use fuzed_iterator::IteratorExt as _;
let mut iter = (0..3).fuze();
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), None);
iter.next(); // Another `next` call would panic!
/// Collects items from an iterator into a vector, but drops the first item.
fn drop_first_and_collect<I: IntoIterator<Item = i32>>(i: I) -> Vec<i32> {
// This implementation is wrong because `next` may be called again even after it
// returned `None`.
let mut i = i.into_iter();
_ = i.next();
i.collect()
}
// Because of the wrong implementation, this test case would fail with a panic.
# /*
#[test]
# */
fn test_drop_first_and_collect_with_empty_array() {
use fuzed_iterator::IteratorExt as _;
let result = drop_first_and_collect([].into_iter().fuze());
assert_eq!(result, []);
}
# test_drop_first_and_collect_with_empty_array();
/// Collects items from an iterator into a vector, but drops the first item.
fn drop_first_and_collect<I: IntoIterator<Item = i32>>(i: I) -> Vec<i32> {
// This is the correct implementation.
let mut i = i.into_iter();
if i.next().is_none() {
return vec![];
}
i.collect()
}
// Test passed!
# /*
#[test]
# */
fn test_drop_first_and_collect_with_empty_array() {
use fuzed_iterator::IteratorExt as _;
let result = drop_first_and_collect([].into_iter().fuze());
assert_eq!(result, []);
}
# test_drop_first_and_collect_with_empty_array();
许可证
MIT 或 Apache 2.0,任选其一