Vec { unsafe { unsafe_iterator().map(|n| wrap_element(n)).co-6ren">
gpt4 book ai didi

closures - 我可以创建一个 "unsafe closure"吗?

转载 作者:行者123 更新时间:2023-11-29 07:55:29 28 4
gpt4 key购买 nike

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

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 使其再次变得安全。代码的结构方式根本没有表达这一点。

我想以某种方式将我的闭包标记为不安全,然后zap有责任使其再次安全。

最佳答案

不可能像 unsafe fn 那样创建一个 unsafe 闭包,因为闭包只是实现了 Fn 的匿名类型code>、FnMut 和/或 FnOnce 特征系列。由于这些特征没有 unsafe 方法,因此不可能创建调用 unsafe 的闭包。

您可以使用 unsafe 方法创建第二组闭包特征,然后为这些方法编写实现,但您会失去很多闭包糖。

关于closures - 我可以创建一个 "unsafe closure"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27746662/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com