【问题标题】:Lifetime of function pointers函数指针的生命周期
【发布时间】:2021-02-03 15:38:55
【问题描述】:

为什么下面的程序不能编译:

pub struct Textbox<'a,VM> {
    get_element: Box<dyn Fn(VM)+'a>,
}

// Works
pub fn new<'a,VM,G:Fn(VM)+'a>(
    get_element: G,
) -> Textbox<'a,VM> {
    Textbox {
        get_element: Box::new(get_element),
    }
}

// Does not work. Compiler complains that we need
// a lifetime bound on VM.
// To the naive programmer writing this, it is unclear why,
// since the above function is accepted.
pub fn new_broken<'a,VM>(
    get_element: fn(VM),
) -> Textbox<'a,VM> {
    Textbox {
        get_element: Box::new(get_element),
    }
}

为什么 'new' 函数可以编译,但 'new_broken' 没有?是什么原因导致需要在“new_broken”中指定 VM 上的生命周期而不是在“new”中?

【问题讨论】:

    标签: rust lifetime


    【解决方案1】:

    由于您在函数路径的某处返回具有通用生命周期的对象,因此您必须声明VM 的生命周期至少与对象的通用生命周期一样长。

    通过声明G: Fn(VM) + 'a,您本质上是在说VM: 'a,因为函数的寿命不能超过其参数的类型。在您的 new_broken 函数中,您永远不会对 VM 的生命周期施加限制,因此 VM 的生命周期可能不会与返回的 Textbox 一样长。

    【讨论】:

    • “因为函数的寿命不能超过它的参数” 需要更多的阐述。正如目前所说的it's not true
    • 我相信这是静态绑定实际上并不重要的实例之一,因此编译器会抛出它。每当我尝试使用函数的“静态性”时,我都不得不确保 A 不会超过函数的寿命:playground
    • 这是一个实例,其中任何大于 a 的边界都会发生这种情况,而不仅仅是静态的:playground
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2016-12-07
    • 2020-02-13
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多