Syntax 什么是铁锈编译器;错误:can';t在fn项目中捕获动态环境;改用|{…}闭包形式";我的意思是,如何修复它?
我收到一个rust编译器错误: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声明了一个变量,然后有一个内部函数,其中我尝试使用此关闭的变量 我相当肯定这是一个初学者的问题,所以如果这是一个非常直截了当的答案,请提前道歉 注意,我在某处使用这个内部函数作
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";