【发布时间】:2015-03-01 01:13:04
【问题描述】:
我有一些代码,简化后看起来像:
fn foo() -> Vec<u8> {
unsafe {
unsafe_iterator().map(|n| wrap_element(n)).collect()
}
}
如果基础数据发生更改,迭代器将返回无效的项目。可悲的是,我在这里无法依赖mut 的正常 Rust 机制(我正在做一些……奇怪的事情)。
为了纠正不安全性,我一次遍历迭代器并复制每个项目(通过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,然后zaps 有责任让它再次安全。
【问题讨论】: