Rust 如何在无限数据流上使用wirefilter

Rust 如何在无限数据流上使用wirefilter,rust,rust-crates,Rust,Rust Crates,我正在编写一个程序,用于从无限流中过滤数据 但由于生命周期的原因,我似乎无法在循环中使用已编译的ast,当我尝试编译时,输出如下: 错误:借用的数据不能存储在其闭包之外 -->src/main.rs:34:33 | 31 | let filter=ast.compile(); |----…因此该变量在声明时有效 32 | 33 |用于data.filter中的my|u struct(| my|u struct |{ |------------借用的数据不能超过此闭包 34 |让执行_conte

我正在编写一个程序,用于从无限流中过滤数据

但由于生命周期的原因,我似乎无法在循环中使用已编译的ast,当我尝试编译时,输出如下:

错误:借用的数据不能存储在其闭包之外
-->src/main.rs:34:33
|
31 | let filter=ast.compile();
|----…因此该变量在声明时有效
32 | 
33 |用于data.filter中的my|u struct(| my|u struct |{
|------------借用的数据不能超过此闭包
34 |让执行_context=my_struct.execution_context();
|^^^^^^^--------------无法推断适当的生存期。。。
|                                 |
|不能存储在其闭包之外
错误:由于上一个错误而中止
错误:无法编译“wirefilter\u”。
要了解更多信息,请使用--verbose再次运行该命令。
梅因

使用wirefilter::{ExecutionContext,Scheme};
懒惰的静态::懒惰的静态{
静态参考方案:方案=方案{
端口:Int
};
}
#[导出(调试)]
结构MyStruct{
端口:i32,
}
impl MyStruct{
fn方案()->&“静态方案”{
&计划
}
fn执行上下文(&self)->ExecutionContext{
让mut ctx=ExecutionContext::new(Self::scheme());
ctx.set_字段_值(“port”,self.port).unwrap();
ctx
}
}
fn main()->结果{
让数据=昂贵的数据迭代器();
设scheme=MyStruct::scheme();
设ast=scheme.parse(“端口在{25}”)?;
让filter=ast.compile();
用于data.filter(| my_struct|{
让execution_context=my_struct.execution_context();
filter.execute(&execution\u context).unwrap()
}).take(10){
println!(“{:?}”,我的结构);
}
好(())
}
fn昂贵的数据迭代器()->impl迭代器{
(0...map(| port | MyStruct{port})
}
货舱

[package]
name = "wirefilter_playground"
version = "0.1.0"
edition = "2018"

[dependencies]
wirefilter-engine = "0.6.1"
failure = "0.1.5"
lazy_static = "1.3.0"
有可能让它工作吗?我只想为最终用户生成过滤后的数据,否则内存中的数据量会很大。
提前谢谢!

看来问题在于返回结构中的生存期省略。特别是以下代码:

fn execution_context(&self) -> ExecutionContext {
    //...
}
与此等效:

fn execution_context<'s>(&'s self) -> ExecutionContext<'s> {
    //...
}
或者可能:

fn execution_context<'s, 'e>(&'s self) -> ExecutionContext<'e>
where 'e: 's {
    //...
}

fn execution_context(&'s self)->executioncontext如果你创建一个
move
closure?
data.filter(move | my_struct{/*…*/}
Hey there@FrenchBoiethios,同样的错误也会发生。嗨,罗德里戈,谢谢!在我看来,省略是要推断“e”而不是“s”。
fn execution_context<'s, 'e>(&'s self) -> ExecutionContext<'e>
where 'e: 's {
    //...
}