它没有。你可能对封闭的工作方式有错误的心理模型。
闭包只是一个函数的句法短手,它具有一个额外的初始参数,捕获定义环境中的值。我们可以重写你的榜样到的东西是逻辑相当于:
fn factory() -> Box<Closure> {
let num = 5;
Box::new(Closure { num: num })
}
struct Closure {
num: i32,
}
impl Closure {
pub fn invoke(&self, x: i32) -> i32 {
x + self.num
}
}
fn main() {
let f = factory();
let answer = f.invoke(1);
assert_eq!(6, answer);
}
注num
被如何获取为了“关闭”的“关闭”构造点。封闭物的主体通过self
(这是真正的封闭魔术)进入。
这和你原来的代码之间的唯一区别是:
的Closure
类型存在,但匿名。也就是说,您不能直接命名该类型,因此必须在返回类型中使用Fn(i32) -> i32
。
由于上述原因,我们返回一个盒装混凝土类型,而不是一个盒装特质对象。就如何使用“封闭”而言,这对我们来说并不重要。我们不能返回Box<Fn(i32) -> i32>
的原因是因为...
我们没有执行Fn
。这不能用稳定的代码完成。如果我们可能,它将几乎与invoke
方法相同。
我们在factory
函数之外定义了“闭包”的主体。然而,这仅仅是一个句法上的区别:封闭的主体不再是执行你的factory
的“部分”而是主体的invoke
是执行的“部分”这个factory
。
所以希望你可以看到,执行不不返回factory
功能:它进入不同的功能,只是碰巧是内factory
为方便起见定义。
这是超好玩!谢谢。 – enaJ