Generics 泛型闭包如何存储在泛型结构中?

Generics 泛型闭包如何存储在泛型结构中?,generics,closures,rust,Generics,Closures,Rust,我有一个我想要存储闭包的通用结构。此闭包的参数和返回类型与结构的最终类型直接相关。我如何定义这样的结构 我知道的唯一方法是使用where关键字组合类型。但是,当试图编译代码时,编译器会停止并抱怨未使用T和'T 我可以通过添加使用T和'T的无用变量来编译它,但我认为有更好、更正确的理由这样做 下面的代码()编译。删除无用的变量,它将不会: pub struct GenericContainer<'t, T: 't, F> where F: Fn(&'t [T]) -> O

我有一个我想要存储闭包的通用结构。此闭包的参数和返回类型与结构的最终类型直接相关。我如何定义这样的结构

我知道的唯一方法是使用
where
关键字组合类型。但是,当试图编译代码时,编译器会停止并抱怨未使用
T
'T

我可以通过添加使用
T
'T
的无用变量来编译它,但我认为有更好、更正确的理由这样做

下面的代码()编译。删除无用的变量,它将不会:

pub struct GenericContainer<'t, T: 't, F> where F: Fn(&'t [T]) -> Option<&'t [T]> {
    generic_closure: F,
    unused: Option<&'t T>
}

impl<'t, T: 't, F> GenericContainer<'t, T, F> where 
    F: Fn(&'t [T]) -> Option<&'t [T]> {

    pub fn new(gc: F) -> Self {
        GenericContainer {
            generic_closure: gc,
            unused: None
        }
    }

    pub fn execute(&self, slice: &'t [T]) -> Option<&'t [T]> {
        let g = &self.generic_closure;
        let _ = &self.unused;
        g(slice)
    }
}

fn main() {
    let g = GenericContainer::new(|s| if s.len() == 0 {None} else {Some(&s[..1])});
    assert!(g.execute(b"   ") == Some(b" "));
    println!("ok");
}
pub-struct-GenericContainer,其中F:Fn(&'t[t])->选项
}
impl GenericContainer Option您处于一种典型的“排名较高的东西”状态:
't
t
仅用于定义类型
F

首先,在生命周期中,您可以使用排名较高的rust生命周期语法:


其中F:for Option Fn(&'t[t])->Option Fn(&'t[t])->Option(&self,slice:&'t[t])->Option对可能也错误地走上这条道路的人来说是一个友好的提示:确保您确实希望以这种方式使用闭包。通常,使用普通的struct+traits路径将完成您想要做的事情,并且不会产生唯一类型的结构。