我可以创建一个“不安全的关闭”吗?

问题描述 投票:0回答:1

我有一些代码,简化后看起来像:

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
有责任使其再次安全。

rust closures unsafe
1个回答
4
投票

不可能以与

unsafe
相同的方式创建
unsafe fn
闭包,因为闭包只是匿名类型,具有
Fn
FnMut
和/或
FnOnce
系列特征的实现。由于这些特征没有
unsafe
方法,因此不可能创建一个
unsafe
来调用的闭包。

您可以使用

unsafe
方法创建第二组闭包特征,然后为它们编写实现,但您会失去很多闭包糖分。

© www.soinside.com 2019 - 2024. All rights reserved.