Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在函数中定义一个静态变量,如c++;_Scala - Fatal编程技术网

Scala 在函数中定义一个静态变量,如c++;

Scala 在函数中定义一个静态变量,如c++;,scala,Scala,在我的函数中,可以有一个变量 在函数调用之间保留其值 仅在该函数内部可见 对于每个线程都是唯一的,即如果我从两个线程调用函数,那么对于每个线程有两个静态变量 我为什么要这样: 我有一个函数,我在其中填写一个列表并返回该列表。问题是,如果我正常声明一个变量,那么每次调用函数时都必须为它分配内存。我希望避免这种情况并且只分配一次,然后每次调用函数时,它都会用正确的值填充该变量,然后返回它 我可以在类内执行以下操作: class MyClass { val __readLineTemp = mu

在我的函数中,可以有一个变量

  • 在函数调用之间保留其值
  • 仅在该函数内部可见
  • 对于每个线程都是唯一的,即如果我从两个线程调用函数,那么对于每个线程有两个静态变量
我为什么要这样:

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

我可以在类内执行以下操作:

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
 }
}
class-MyClass{
val-readLineTemp=可变索引相等填充[Int](5)(-1)
def readLine()={
变量i=0
while(i<\u\u readLineTemp.length)
{
__readLineTemp(i)=Random.nextInt()
i+=1
}
__readLineTemp
}
}
我对这种方法的问题是,它不满足第2点和第3点,即只在方法内部可见,并且对每个线程都是唯一的。然而,对于第3点,我可以简单地让每个线程初始化自己的MyClass对象


我知道可能没有办法完全实现我想要的,但有时人们会想出聪明的想法来克服这一点,特别是Scala似乎很深,你可以做很多技巧

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

def foo = {
    var a = 5
    () => {
        a = a + 1
        a
    }
}
i、 e.创建一个包含静态变量的闭包(在您的例子中,这是
\uu readLineTemp
),并返回一个函数,该函数是唯一可以访问该变量的函数

然后这样使用以满足螺纹要求:

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

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

def foo = {
    var a = 5
    () => {
        a = a + 1
        a
    }
}
i、 e.创建一个包含静态变量的闭包(在您的例子中,这是
\uu readLineTemp
),并返回一个函数,该函数是唯一可以访问该变量的函数

然后这样使用以满足螺纹要求:

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

完美的这真的很聪明,正是我希望得到的。我今天刚刚读到了闭包,我想知道什么时候我会需要这个功能!是的,闭包非常有用,特别是在JavaScript这样的语言中,闭包是唯一创建作用域的东西(尽管ECMAScript 6和
let
)会发生变化。hmmm。。。您确定该变量只创建一次吗?我对您的答案的理解是,“var a=5”是在定义“foo”时执行的,而不是每次调用它时。然而,对它进行基准测试表明,与我的示例相比,它的速度非常慢,即每次调用它时,它都必须为它分配内存。我刚刚调试了它。它会在每次调用函数时创建变量,您必须执行
val f=new DynamicVariable(foo)
val f=foo
然后调用
f
。这就是f从初始化闭包中得到的结果,并成为返回的函数。如果你直接给foo打电话,它每次都会创建它。太好了!这真的很聪明,正是我希望得到的。我今天刚刚读到了闭包,我想知道什么时候我会需要这个功能!是的,闭包非常有用,特别是在JavaScript这样的语言中,闭包是唯一创建作用域的东西(尽管ECMAScript 6和
let
)会发生变化。hmmm。。。您确定该变量只创建一次吗?我对您的答案的理解是,“var a=5”是在定义“foo”时执行的,而不是每次调用它时。然而,对它进行基准测试表明,与我的示例相比,它的速度非常慢,即每次调用它时,它都必须为它分配内存。我刚刚调试了它。它会在每次调用函数时创建变量,您必须执行
val f=new DynamicVariable(foo)
val f=foo
然后调用
f
。这就是f从初始化闭包中得到的结果,并成为返回的函数。如果你直接调用foo,它每次都会创建它。