2016-12-04 22 views

回答

5

它没有。你可能对封闭的工作方式有错误的心理模型。

闭包只是一个函数的句法短手,它具有一个额外的初始参数,捕获定义环境中的值。我们可以重写你的榜样到的东西是逻辑相当于:

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(这是真正的封闭魔术)进入。

和你原来的代码之间的唯一区别是:

  1. Closure类型存在,但匿名。也就是说,您不能直接命名该类型,因此必须在返回类型中使用Fn(i32) -> i32

  2. 由于上述原因,我们返回一个盒装混凝土类型,而不是一个盒装特质对象。就如何使用“封闭”而言,这对我们来说并不重要。我们不能返回Box<Fn(i32) -> i32>的原因是因为...

  3. 我们没有执行Fn。这不能用稳定的代码完成。如果我们可能,它将几乎与invoke方法相同。

  4. 我们在factory函数之外定义了“闭包”的主体。然而,这仅仅是一个句法上的区别:封闭的主体不再是执行你的factory的“部分”而是主体的invoke是执行的“部分”这个factory

所以希望你可以看到,执行不返回factory功能:它进入不同的功能,只是碰巧是factory为方便起见定义

+0

这是超好玩!谢谢。 – enaJ

相关问题