rust 编译器“错误:无法捕获 fn 项中的动态环境;改用 || { ... } 闭包形式”是什么意思,以及如何修复它?

2024-03-07

我收到 Rust 编译器错误:

src/main.rs:33:31: 33:35 error: can't capture dynamic environment in a fn item; use the || { ... } closure form instead

发生错误是因为我有一个函数,在其中使用声明变量let,然后有一个内部函数,我在其中尝试使用这个封闭的变量。

我相当确定这是一个初学者问题,如果有一个非常直接的答案,请提前抱歉!

请注意,我在某处使用此内部函数作为回调,因此使用闭包,例如

let closure_fn = | args | -> () { do stuff };

...对我来说不是一个合适的解决方案。


extern crate nickel;

use std::io::net::ip::Ipv4Addr;
use nickel::{ Nickel, Request, Response };

fn stub_3rd_party_function() -> String {
    "hello world".to_string()
}

fn main() {

    let mut server = Nickel::new();

    // assume that the variable **must** be instantiated like this
    let hello_text : String = stub_3rd_party_function();

    fn hello_handler (_request: &Request, response: &mut Response) -> () {
        response.send(hello_text.as_slice());
    }
    server.get("/hello", hello_handler);

    server.listen(Ipv4Addr(0,0,0,0), 6767);
}

结果出现以下错误:

src/test.rs:12:23: 12:33 error: can't capture dynamic environment in a fn item; use the || { ... } closure form instead
src/test.rs:12         response.send(hello_text);
                                     ^~~~~~~~~~
src/test.rs:12:23: 12:33 error: unresolved name `hello_text`.
src/test.rs:12         response.send(hello_text);
                                     ^~~~~~~~~~
error: aborting due to 2 previous errors

现在,我从标准函数切换到闭包函数:

extern crate nickel;

use std::io::net::ip::Ipv4Addr;
use nickel::{ Nickel, Request, Response };

fn stub_3rd_party_function() -> String {
    "hello world".to_string()
}

fn main() {

    let mut server = Nickel::new();

    // assume that the variable **must** be instantiated like this
    let hello_text : String = stub_3rd_party_function();

    let hello_handler = |_request: &Request, response: &mut Response| -> () {
        response.send(hello_text.as_slice());
    };
    server.get("/hello", hello_handler);

    server.listen(Ipv4Addr(0,0,0,0), 6767);
}

导致不同的错误:

src/test.rs:21:30: 21:43 error: mismatched types: expected `fn(&nickel::request::Request<'_>, &mut nickel::response::Response<'_,'_>)` but found `|&nickel::request::Request<'_>, &mut nickel::response::Response<'_,'_>|` (expected extern fn but found fn)
src/test.rs:21         server.get("/hello", hello_handler);
                                            ^~~~~~~~~~~~~
error: aborting due to previous error

是否有一种方法可以用普通函数“包装”封闭函数?

由于我使用的库需要标准函数而不是闭包, 我不能使用闭包。 但是如果我不使用闭包,我就无法关闭外部函数中定义的变量,fn main () { ... }...因此被困在这里。

请注意,上面我使用的是字符串,hello_text,目的是提供简洁的代码示例。 在这种情况下,使用静态变量就足够了。但是,静态变量不会为我解决这个问题,因为我需要能够从一个变量中分配一个变量fn main()函数调用的结果,然后在我的内部处理函数中使用它。


它这么说是因为这是一个简单的事实:函数不能捕获变量;函数不能捕获变量。如果将一个函数放入另一个函数中,则该函数位于该函数内部而不是外部,这纯粹是命名空间的问题,并使其绝对私有并且其他任何东西都无法访问。如果你想要这样的变量捕获,你必须使用闭包。

在您的具体情况下,函数是唯一的方法。你应该考虑你的代码是这样的(我也会这样写,如果没有别的办法的话,以减少缩进):

fn hello_handler(_request: &Request, response: &mut Response) {
    response.send(hello_text);
}

fn main() {
    let mut server = Nickel::new();
    let hello_text = "hello world";
    server.get("/hello", hello_handler);
    server.listen(Ipv4Addr(0, 0, 0, 0), 6767);
}

正如你所看到的,通过这种表达方式,hello_text显然无法从hello_handler。之所以必须如此,也有充分的技术原因——每个请求都在自己的任务中处理。在这种特殊情况下,静态是解决方案:

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

rust 编译器“错误:无法捕获 fn 项中的动态环境;改用 || { ... } 闭包形式”是什么意思,以及如何修复它? 的相关文章

随机推荐

  • 极端情况、意外和不寻常的 MATLAB [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 JavaFX 中重新加载应用程序?

    我有一个小游戏 里面有New Game按钮 有很多变量需要重置New Game按钮被按下 是否有任何方法可以轻松地重新加载整个应用程序或任何替代方案来刷新场景 阶段或变量 我只想在首次加载应用程序时将其带入初始阶段 我在互联网上浏览了不同的
  • PHP 按位异或 vs. JavaScript 按位异或

    我正在尝试找到一种方法来制作PHP Bitwise XOR结果与以下结果相符JavaScript Bitwise XOR 我遇到了这个问题的不同问题 但都没有答案 这里有几个 Javascript 和 PHP 异或等效项 https sta
  • ios 录制视频并同时播放音频

    我想同时录制视频和播放音频 当开始录制视频时 预加载的音频开始播放 当停止视频录制时 音频也停止播放 我尝试使用第三方库录制视频 迅捷相机 https github com Awalz SwiftyCam https github com
  • 纱线错误:没有场景;必须至少有一个

    我尝试安装Yarn https yarnpkg com lang en 当我使用yarn我得到的命令 00h00m00s 0 0 ERROR There are no scenarios must have at least one my
  • 对溢出菜单项使用自定义视图

    我在对操作栏 Sherlock 中的溢出菜单执行任何操作时遇到了真正的困难 理想情况下 我想使用自定义TextView为每个项目设置不同的字体并更改颜色pressed state 我已经尝试过 都没有成功 更改操作栏溢出的样式 https
  • 使用原始 JavaScript 提交函数时,jQuery 验证不会触发

    我的表单上有 jQuery 验证 当我单击提交按钮时 将调用 保存 函数 function save var form document getElementById myForm form submit lt jquery validat
  • 如何使用 SAM 在本地运行 C++ AWS Lambda 函数?

    我想尝试 AWS Lambda 的自定义 C 运行时并使用本地测试SAM https docs aws amazon com serverless application model latest developerguide what i
  • 如何使用 Pandas 对多索引列重新排序?

    表格显示在这里 https i stack imgur com Q4Hmo png code dff pd DataFrame Country France 4 China 4 Progress Develop Middle Operate
  • 光流 .flo 文件

    我有几个关于做光流项目的问题 我使用Python 2 计划使用烤宽面条使用深度学习来学习光流 并且不知道如何将c 函数转换为python的流可视化函数 我下载了 来自http vision middlebury edu flow data
  • 如何使用 Qt HTML5 应用程序向浏览器发送数据或从浏览器发送数据

    在线教程均未展示如何创建 Qt HTML5 应用程序 理想情况下 我只需要一种在 webkit 和 Qt 之间发送数据的方法 一个字符串即可 当我创建 Qt HTML5 应用程序时它会生成 myApp pro html5 applicati
  • 将结构数组从 C# 传递到 C++ DLL

    我试图将结构数组传递到 C DLL 中并遇到问题 我已经尝试了好几天了 但没有成功 我可以从 C 中获取数据 但当我尝试使用 NET 获取结构数组时 我遇到了问题 C 原型是 static declspec dllexport int So
  • 模板的丑陋编译器错误

    template
  • Java 文本格式化

    如何将文本字符串 如名字 姓氏 电话等 格式化为列 这不会做到这一点 String customer t surname t givenname t blablabla 请参阅文档String format http java sun co
  • 按名称按字母顺序排序在数据表中不起作用

    在这里 我从控制器中获取了数据 一切都很好 根据字母顺序 但在数据表中它不是我想要得到的 意味着查看时按字母顺序排列 这里所有数据默认按降序排列 aaSorting 0 desc 我需要它根据名称字段按字母顺序排序 我附上了一张快照以供更多
  • Parse SDK无法在后台获取位置,总是超时异常

    这是我正在使用的代码 ParseGeoPoint getCurrentLocationInBackground 10000 new LocationCallback Override public void done ParseGeoPoi
  • 关于 C# 事件调用中使用的线程

    下面是我学习C 事件调用的代码 以及其中使用线程的情况 我在使用过程中有几个疑问 using System using System Collections Generic using System Linq using System Te
  • 如何控制应用程序在哪个监视器上打开?

    作为工作中的双显示器用户 我注意到应用程序在打开的显示器 主显示器或辅助显示器 应用程序打开的最后一个显示器等 方面的行为有所不同 老实说 有些应用程序让我很恼火 因为我希望它们在我的主显示器上打开 如果我希望它们在那里 我会将它们移动到我
  • 如何以编程方式删除 UITextField 的内容?

    我正在编写一个 iPhone 应用程序 它有许多 UITextFields 需要用户输入一堆数据 我想要一个简单的 删除 工具 允许用户丢弃他们放入多个字段中的任何数据 我已经为这个问题苦苦挣扎了几天 我似乎无法找到进入各个文本字段并更改文
  • rust 编译器“错误:无法捕获 fn 项中的动态环境;改用 || { ... } 闭包形式”是什么意思,以及如何修复它?

    我收到 Rust 编译器错误 src main rs 33 31 33 35 error can t capture dynamic environment in a fn item use the closure form instead