如何将闭包移动到结构体字段?

问题描述 投票:0回答:1

我有这个不起作用的 Rust 代码片段:

use std::cmp::Ordering;

struct Sortable<T> {
    buffer: Vec<T>,
    compare: Box<dyn Fn(&T, &T) -> Ordering>,
}

impl<T> Sortable<T> {
    fn new(compare_func: impl Fn(&T, &T) -> Ordering) -> Sortable<T> {
        Sortable {
            buffer: Vec::new(),
            compare: Box::new(compare_func),
        }
    }

    fn sort(&mut self) {
        self.buffer.sort_by(&self.compare);
    }
}

编译器抛出此错误:

the parameter type `impl Fn(&T, &T) -> Ordering` may not live long enough

我认为参数

compare_func
将从调用者移动到函数
new
,然后移动到结构体字段
compare
,因为函数声明中没有引用(
&
)。但不知何故,这个错误是关于生命周期问题的。我在这里做错了什么,还是有一些解决方法可以做到这一点?

rust ownership
1个回答
0
投票

这可以通过要求闭包具有静态生命周期来解决。这反映了函数签名中结构体的生命周期要求。

use std::cmp::Ordering;

struct Sortable<T> {
    buffer: Vec<T>,
    compare: Box<dyn Fn(&T, &T) -> Ordering>,
}

impl<T> Sortable<T> {
    fn new(compare_func: impl 'static + Fn(&T, &T) -> Ordering) -> Sortable<T> {
        Sortable {
            buffer: Vec::new(),
            compare: Box::new(compare_func),
        }
    }

    fn sort(&mut self) {
        self.buffer.sort_by(&self.compare);
    }
}

铁锈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.