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路径将完成您想要做的事情,并且不会产生唯一类型的结构。