代码之家  ›  专栏  ›  技术社区  ›  Zifre

可变或不可变闭包

  •  1
  • Zifre  · 技术社区  · 15 年前

    在命令式、面向对象的语言中,使用可变或不可变闭包更有意义吗?

    例如:

    int i=5;
    function() f={print(i);};
    f();
    i=6;
    f();
    

    5
    6
    

    如果它是不可变的,它将打印:

    5
    5
    

    我意识到即使使用不可变闭包,您仍然可以这样做:

    class I {int i;}
    I i=new I();
    i.i=5;
    function() f={
        I j=i;
        print(j.i);
    };
    f();
    i.i=6;
    f();
    

    那么,使用可变闭包或不可变闭包会更好,还是两者都可以选择?不可变闭包似乎更容易实现,所以在这一点上,我想我将使用它,除非有很好的理由不这样做。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    6 年前

    命令式语言通常是围绕状态的概念构建的。因此,语言特性(包括闭包)更能反映这一点。是的,这种行为有时会令人困惑,但它是问题的一部分,也是在应用程序中具有状态的优势。

    class Student {
      public string Name { get; set; }
    }
    
    void Example() {
      var student = new Student() { Name = "foo" };
      Action() del = () => 
        { student.Name = "bar"; };
      del();
    }
    

    这可以通过一个不可变的闭包来实现,因为我实际上并不修改变量指向的位置。然而,很明显,我仍在进行变异操作。

        2
  •  3
  •   Brian    15 年前

    语言应该有按值捕获或按引用捕获的lambda吗?你自己决定,但请看“ On lambdas, capture, and mutability “更多评论。