[英]How do you create a generic function in Rust with a trait requiring a lifetime?
[英]How do I pass a method to a function requiring a static lifetime parameter?
考虑到函数采用具有静态生命周期的“处理程序”,如何将方法传递给函数?
(这背后的确切的使用情况是一个的创建铁链在结构)。
考虑到我们有以下结构Chain
:
struct Chain
{
f: Box<dyn Fn()>
}
impl Chain
{
fn new(handler: impl Fn() + 'static) -> Self
{
return Chain { f: Box::new(handler) };
}
fn invoke(&self)
{
(self.f)();
}
}
当尝试使用闭包创建此Chain
的实例时,同时还在闭包中传递一个方法......
struct MyStruct
{
the_answer: u32
}
impl MyStruct
{
pub fn run(&self)
{
let closure = || {
println!("Closure called");
self.printer_method(String::from("printer_method")); // <-- Problematic line
};
let chain = Chain::new(closure);
chain.invoke();
}
fn printer_method(&self, msg: String)
{
// Access to self.the_answer
println!("The answer is {}, your message is: {}", self.the_answer, msg);
}
}
...编译器给出以下错误:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
我已经MyStruct
及其成员声明MyStruct
静态的想法,但是需要能够创建结构的多个独立实例(参见 Iron Web 服务器的多个实例)。
这是一个游乐场链接。
在您的关闭中:
let closure = || {
println!("Closure called");
self.printer_method(String::from("printer_method")); // <-- here
};
由于方法调用,您正在捕获&MyStruct
。 由于 rust 中的闭包基本上只是带有“call”方法的结构,因此这个闭包不能是“静态的”,因为它会比对MyStruct
的引用MyStruct
。 解决方案是在这个生命周期内变得通用:
struct Chain<'a>
{
f: Box<dyn Fn() +'a>
}
impl<'a> Chain<'a>
{
fn new(handler: impl Fn() + 'a) -> Self
{
return Chain { f: Box::new(handler) };
}
fn invoke(&self)
{
(self.f)();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.