在 Rust 中调用存储在结构体中的堆栈分配闭包

2023-12-19

我将闭包存储在如下结构中:

#[derive(Clone)]
struct S<'a> {
    func: &'a FnOnce() -> u32
}

fn main() {
    let s = S { func: &|| 0 };
    let val = (s.func)();
    println!("{}", val);
}

当我编译时,s.func无法移动以执行自身。我理解为什么它不能被移动(即它只是一个引用,并且它的大小在编译时未知),但根本不知道为什么它被移动——仅仅是因为闭包是通过特征实现的吗?

这是错误消息:

error[E0161]: cannot move a value of type std::ops::FnOnce() -> u32:
the size of std::ops::FnOnce() -> u32 cannot be statically determined
 --> main.rs:8:15
  |
8 |     let val = (s.func)();
  |               ^^^^^^^^

error[E0507]: cannot move out of borrowed content
 --> main.rs:8:15
  |
8 |     let val = (s.func)();
  |               ^^^^^^^^ cannot move out of borrowed content

error: aborting due to 2 previous errors

这是解决这个问题的唯一方法吗?将闭包存储在堆上(通过Box<FnOnce() -> u32>)?为什么调用闭包会移动它?据推测,调用它不会改变函数本身。


关闭地点正在移动,因为FnOnce::call_once https://doc.rust-lang.org/stable/std/ops/trait.FnOnce.html#tymethod.call_once takes self按价值。该合约强制保证该函数不会被多次调用。

如果您确实最多调用一次闭包,并且您想使用FnOnce特征,那么你的结构需要拥有该闭包的所有权(并且你需要使你的结构在闭包类型上通用)。请注意,调用闭包会将闭包移出结构,从而使整个结构无效;你可以通过包装来解决这个问题FnOnce in an Option and take https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.take- 关闭闭包Option在调用它之前。

如果您可能多次调用闭包,您不想获得闭包的所有权,或者您不想使您的结构在闭包类型上通用,那么您应该使用Fn or FnMut反而。Fn::call https://doc.rust-lang.org/stable/std/ops/trait.Fn.html#tymethod.call takes self通过参考和FnMut::call_mut https://doc.rust-lang.org/stable/std/ops/trait.FnMut.html#tymethod.call_mut takes self通过可变引用。由于两者都接受引用,因此您可以将特征对象与它们一起使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rust 中调用存储在结构体中的堆栈分配闭包 的相关文章

随机推荐

  • 在 nginx 生产服务器上找不到单个 laravel 路由 (404)

    In Laravel 5 4我有很多 api 路由 所有这些都工作正常 我添加了一条名为 schedules 的路线 该路线在我的开发站点上运行良好 在生产服务器上我收到404这条单一路线的错误 我用Nginx 我所有的测试都通过了 路线已
  • 为什么sklearn Imputer需要拟合?

    我对机器学习这件事真的很陌生 我正在学习关于这个主题的在线课程 在本课程中 讲师展示了以下代码 imputer Inputer missing values Nan strategy mean axis 0 imputer Imputer
  • 如何在mawk中启用区间正则表达式?

    当我在 Ubuntu 1604 上运行 mawk 时遇到一个问题 echo 123 456 mawk 0 0 9 3 print 0 尽管常规模式实际上匹配 但上面的命令没有输出任何内容 然后我尝试使用相同的常规模式运行egrep echo
  • 在 C# 中解析 JSON

    我从 RESTful API 收到 JSON 对象形式的响应 通常 当密钥已知时我可以很好地解析它 例如 我创建一个User像这样的类 DataContract public class User DataMember public str
  • 移动eclipse安装目录会出现问题

    我最近重新组织了我的 Eclipse 安装目录 以满足各种风格的 Eclipse Helios Indigo Juno 但这导致了一个问题 因为 eclipse 目录 位于我的主目录中 有子目录标识 Eclipse 版本但以我认为标识安装目
  • elasticsearch 得到太多结果,需要帮助过滤查询

    我在理解 ES 查询系统的底层方面遇到了很多问题 例如 我有以下查询 size 0 query bool must term referer www xx yy com range timestamp gte now lt now 1h
  • 使用 Homebrew 安装 Cmake 3.19.2

    我正在尝试安装旧版本的 CMake 来编译需要它的软件 https github com horosproject horos https github com horosproject horos 如果你使用brew install cm
  • document.onclick 与 window.onclick

    有什么区别吗 document onclick and window onclick event JavaScript Window 对象是最高级别的 JavaScript 对象 对应于 Web 浏览器窗口 文档对象是 HTML 文档的 H
  • Django 中的多个站点

    有谁知道如何向 Django 添加多个域 我尝试按照此处的指南进行操作单个 Django 项目下的多个站点 https stackoverflow com questions 3369486 multiple sites under sin
  • 反应原生 - 当“resetTo”路线时,没有动画

    我正在使用导航器组件 我有启动场景 1 秒后将显示下一个场景 我需要在启动结束后重置导航堆栈 当我使用resetTo方法时 场景之间的过渡一致而没有动画 我怎样才能制作动画 您可以使用一些代码来解决方法onDidFocusprop 并将对象
  • dom range.setStart / setEnd

    我试图仅将文本加粗hel在这个小提琴中http jsfiddle net yarkpakv http jsfiddle net yarkpakv 但它似乎不起作用 我做错了什么 var range document createRange
  • 安装 Xcode 4 后的属性列表编辑器

    我安装 Xcode 4 后找不到它在哪里 有人知道它在哪里吗 Edit 我安装了另一个用于编辑 XML 文件的应用程序 它被命名为XMLEditor并位于here http www xmlmind com xmleditor downloa
  • 在网站的每个页面上使用 SSL 有多重要? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我在我正在开发的网站上安装了一个证书 我已使网站尽可能多地使用 HTTP 但在您登录后 它必须保留在 HTTPS 中以防止会话劫持 不是吗
  • 我应该在关闭资源解析器之前关闭会话吗

    我有简单的服务 让我们使用 resourcesResolver 和 session 来实现一些逻辑 Component immediate true Service value ServiceInterface class public c
  • 在 RecyclerView 中垂直居中所选项目

    我正在尝试为我的应用程序实现某种轮式选择器 因为当前选项依赖于自定义Views或旧的ListView 所以我想将我的解决方案基于RecyclerView 到目前为止我所做的就是在开始和结束时设置RecyclerView two View具有
  • ajax 调用后使用 PHP 重定向

    我正在执行以下 ajax 调用 save sale click function var save sale 1 ajax type GET url summary php data save sale save sale success
  • 本地分支的文件存储在哪里

    今天我遇到了一件有趣的事情 这让我想知道 git 如何处理本地分支 所以我在我的存储库上遇到了一些问题 删除了本地文件夹 它进入了回收站 并重新克隆 也许极端 在我这样做之后 我意识到我删除了一个我从未推送过的本地分支 因为它是一个个人项目
  • Spring MVC 的 ehcache 或 spring 缓存中的最佳缓存实践是什么?

    计划在基于 Spring Web 的应用程序中实现静态数据的缓存机制 谁能解释一下哪种是最好的以及它是如何工作的 EhCache 弹簧缓存 免责声明 我是兵马俑 Software AG http www terracotta org员工 E
  • Ruby 中的全局方法 [重复]

    这个问题在这里已经有答案了 如果 Ruby 中的所有 函数 都是方法 那么当我调用方法而没有明确提及调用它们的对象时 它们会发送给谁 Ruby 编程语言一书 Flanagan Matsumoto 说 如果省略对象 则在 self 上调用该方
  • 在 Rust 中调用存储在结构体中的堆栈分配闭包

    我将闭包存储在如下结构中 derive Clone struct S lt a gt func a FnOnce gt u32 fn main let s S func 0 let val s func println val 当我编译时