在像c ++这样的函数中定义一个静态变量

时间:2014-05-04 15:46:36

标签: scala

在我的函数中,我可以使用

变量吗?
  • 在函数调用之间保留其值。
  • 仅在该功能内可见
  • 每个线程都是唯一的,即如果我从两个线程调用该函数,则每个线程有两个静态变量。

为什么我要这样:

我有一个函数,我在其中填写一个列表并返回该列表。问题是如果我正常声明一个变量,那么每次调用函数时我都必须为它分配内存。我想避免并且只分配一次然后每次调用函数时它会用适当的值填充该变量然后返回它。

我可以在课程中执行以下操作:

class MyClass {
 val __readLineTemp = mutable.IndexedSeq.fill[Int](5)(-1)
 def readLine() = {
     var i = 0
     while (i < __readLineTemp.length) 
     {
         __readLineTemp(i) = Random.nextInt()
         i += 1
     }
     __readLineTemp
 }
}

我对这种方法的问题在于它并不满足第2点和第3点,即仅在方法内部可见并且对于每个线程是唯一的。但是,对于第3点,我可以简单地让每个线程初始化自己的MyClass对象。

我知道可能没有办法达到我想要的东西,但有时候人们会提出聪明的想法来克服这个问题,特别是Scala看起来很深,你可以做很多技巧

1 个答案:

答案 0 :(得分:4)

您可以使用闭包来满足1和2:

def foo = {
    var a = 5
    () => {
        a = a + 1
        a
    }
}

即。创建一个包含静态变量的闭包(在你的情况下,这是__readLineTemp)并返回一个只能访问变量的函数。

然后像这样使用它来满足线程要求:

val t1 = new Thread(new Runnable {
    def run = {
        val f = new DynamicVariable(foo)
        println(f.value())
        println(f.value())
    }
})