#迭代器 #包装器 #检测 #panic #不正确 #非融合

无std 融合迭代器

用于检测非融合迭代器使用错误的迭代器包装器

2个稳定版本

1.0.1 2024年1月25日
1.0.0 2023年8月13日

#252 in 调试

每月41次下载
yash-cli 中使用

MIT/Apache

11KB
130

融合迭代器

fuzed-iterator at crates.io fuzed-iterator at docs.rs Build status Changelog

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();

许可证

MITApache 2.0,任选其一

无运行时依赖