我可以在Scala中复制一个闭包吗?

Dan*_*owy 2 closures scala

这可能是一个半生不熟的想法,但我可以复制表达式的环境吗?请考虑以下示例:

class foo[T](block: => T) {
  var data = { () => block }
  def run() = { data() }
}

var a = 5

var b = new foo({ a += 1; println(a) })
var c = new foo({ a += 1; println(a) })

b.run()
c.run()
b.run()
c.run()
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

6
7
8
9
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是以下内容:

6
6
7
7
Run Code Online (Sandbox Code Playgroud)

简而言之,foo一旦初始值得到解决,我希望在块中有变量的副本而不是引用它们.可以这样做吗? scala.util.DynamicVariable似乎很有希望,但我很难理解如何在上面的例子中使用它.

n. *_* m. 6

如果你想制作副本,那么为什么不制作副本呢?

 var c = new foo({ var aa = a + 1; println(aa) })
Run Code Online (Sandbox Code Playgroud)

如果你想获取一个引用变量的现有闭包,并将其转换为一个引用该变量副本的闭包,那么我担心这是不可能的.

在任何情况下,除了非常罕见的情况和非常受控的方式外,不应使用可变变量.也就是说,不要耍弄他们的参考文献.

  • +1对可变变量的警告. (2认同)