Syntax 什么是铁锈编译器;错误:can';t在fn项目中捕获动态环境;改用|{…}闭包形式";我的意思是,如何修复它?

Syntax 什么是铁锈编译器;错误:can';t在fn项目中捕获动态环境;改用|{…}闭包形式";我的意思是,如何修复它?,syntax,rust,Syntax,Rust,我收到一个rust编译器错误: src/main.rs:33:31: 33:35 error: can't capture dynamic environment in a fn item; use the || { ... } closure form instead 发生此错误的原因是,我有一个函数,其中我使用let声明了一个变量,然后有一个内部函数,其中我尝试使用此关闭的变量 我相当肯定这是一个初学者的问题,所以如果这是一个非常直截了当的答案,请提前道歉 注意,我在某处使用这个内部函数作

我收到一个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 };
。。。这对我来说不是一个合适的解决方案


导致以下错误:

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
src/test.rs:21:30:21:43错误:不匹配的类型:应为'fn(&nikel::request::request,&mut nikel::response::response`(应为外部fn,但找到了fn)
src/test.rs:21 server.get(“/hello”,hello\u handler);
^~~~~~~~~~~~~
错误:由于上一个错误而中止
是否有一种方法可以用普通函数“包装”封闭函数

因为我使用的库需要一个标准函数而不是闭包, 我不能用闭包。 但是如果我不使用闭包,我就不能关闭在外部函数中定义的变量,
fn main(){…}
…并因此卡在这里

请注意,为了提供一个简洁的代码示例,我在上面使用了一个字符串,
hello\u text

在这种情况下,使用静态变量就足够了。但是,静态变量不会为我修复它,因为我需要能够从
fn main()中分配变量
函数调用的结果,然后在我的内部处理函数中使用它。

它说,因为这是一个简单的事实:一个函数不能捕获变量;如果你把一个函数放在另一个函数中,那么函数在函数中而不是在函数外部纯粹是一个名称空间的问题,并使它绝对不受影响ivate和其他任何东西都无法访问。如果要捕获此类变量,必须使用闭包

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

通过这种表达方式,您可以看到,
hello\u text
显然无法从
hello\u handler
访问。必须这样做有很好的技术原因,而且每个请求都在其自己的任务中处理。在这种特殊情况下,静态是解决方案:

static HELLO_TEXT: &'static str = "hello world";

现在是另一个更新,显示当我切换到一个闭包函数时,我得到的编译器错误。@克里斯摩根-是的,我确实考虑过使用静态。但是这感觉就像作弊。另外,我在这里使用了一个字符串来减少一个例子的复杂度。从另一个
extern
库中打开;因此静态在这里不起作用。我需要一种方法将某些内容分配给
fn main()
中的变量,然后在我的处理程序函数中使用该变量,
fn hello\u handler()
…作弊?这是唯一的方法。由于任务模型,请求之间可能没有任何共享的可变状态。您的请求必须是无状态的。当然,这不是完全正确的,有一些事情像
Arc
rBlock
互斥体
等等,但暂时忘记它们。您到底是什么想做什么?好的,明白了。我想能够实例化一个数据库连接对象,并在处理程序中使用它。啊,现在这是一个完全不同的问题。对于初学者,你不需要数据库连接对象,你需要一个池,比如。至于如何将其与Nickel连接起来,你可能需要使用某种形式的middlew是的,你可能需要某种形式的全球服务(Nickel可能有一种方式,或者你可能想要类似的东西)。
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);
}
static HELLO_TEXT: &'static str = "hello world";