繁体   English   中英

如何将方法传递给需要静态生命周期参数的函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM