我有一些代码,简化后看起来像:
fn foo() -> Vec<u8> {
unsafe {
unsafe_iterator().map(|n| wrap_element(n)).collect()
}
}
这个迭代器会返回在底层数据改变时会失效的元素。遗憾的是,我不能像平常那样依赖 Rust 的 mut
机制(我在做一些...奇怪的事情)。
为了纠正这种不安全性,我一次性遍历整个迭代器,对每个元素进行复制(通过 wrap_element
),然后将它们全部放入一个 Vec
中。这种方式有效是因为没有其他内容有机会修改底层数据。
代码目前可以正常工作,但由于我多次使用这种习惯用法,所以我想稍微简化一下我的代码:
fn zap<F>(f: F) -> Vec<u8>
where F: FnOnce() -> UnsafeIter
{
f().map(|n| wrap_element(n)).collect()
}
fn foo() -> Vec<u8> {
zap(|| unsafe { unsafe_iterator() }) // Unsafe block
}
我对这种解决方案的问题在于调用unsafe_iterator
是不安全的,而正是wrap_element
/collect
使其再次变得安全。代码结构根本没有传达出这一点。
我想以某种方式标记我的闭包为unsafe
,然后由zap
负责使其再次变得安全。