我如何实现一个方法,该方法充当包含闭包的结构的构造函数?我是Rust的新手,关于封装正在积极开展的工作,我很难在文档中找到解决方案。
struct A<'self> {
fOne: &'self fn(),
}
impl<'self> A<'self> {
fn new() {
println!("Ideally this would return a struct of type A");
}
}
fn run(f: &fn()) {
f();
}
fn main() {
let apples = 5;
let example = A {
fOne: || {
println!("{} apples on the tree.", apples);
},
};
A::new();
run(example.fOne);
}
这是我能够在不遇到大量问题的情况下获得的。我似乎无法创建一个接受闭包作为参数的A::new()
版本,使用该参数创建类型A
的结构,然后返回新创建的结构。有没有办法做到这一点,或者如果没有,我不理解什么?
答案 0 :(得分:5)
闭包被视为一种通用;通常使用类型参数名称F
:
struct A<F> {
f_one: F,
}
impl<'a, F> A<F> {
fn new(f: F) -> Self {
A { f_one: f }
}
}
fn main() {
let apples = 5;
let example = A::new(|| println!("{} apples on the tree.", apples));
(example.f_one)(); // extra parens to disambiguate from calling a method
}
通常,您会看到限制类型或impl
块的限制,将通用限制为特定类型的闭包:
struct A<F>
where
F: Fn(),
{
f_one: F,
}
impl<'a, F> A<F>
where
F: Fn(),
{
fn new(f: F) -> Self {
A { f_one: f }
}
}