我可以创建一个 "unsafe closure" 吗?
Can I create an "unsafe closure"?
我有一些代码,简化后看起来像:
fn foo() -> Vec<u8> {
unsafe {
unsafe_iterator().map(|n| wrap_element(n)).collect()
}
}
迭代器 returns 基础数据更改时将失效的项目。可悲的是,我无法在这里依赖 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
,然后 zap
有责任使其再次安全。
不可能像 unsafe fn
一样创建 unsafe
闭包,因为闭包只是实现了 Fn
、FnMut
的匿名类型, and/or FnOnce
特征家族。由于这些特征没有 unsafe
方法,因此无法创建要调用 unsafe
的闭包。
您可以使用 unsafe
方法创建第二组闭包特征,然后为这些方法编写实现,但您会损失很多闭包糖。
我有一些代码,简化后看起来像:
fn foo() -> Vec<u8> {
unsafe {
unsafe_iterator().map(|n| wrap_element(n)).collect()
}
}
迭代器 returns 基础数据更改时将失效的项目。可悲的是,我无法在这里依赖 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
,然后 zap
有责任使其再次安全。
不可能像 unsafe fn
一样创建 unsafe
闭包,因为闭包只是实现了 Fn
、FnMut
的匿名类型, and/or FnOnce
特征家族。由于这些特征没有 unsafe
方法,因此无法创建要调用 unsafe
的闭包。
您可以使用 unsafe
方法创建第二组闭包特征,然后为这些方法编写实现,但您会损失很多闭包糖。