Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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中循环依赖的解析_Scala_Initialization - Fatal编程技术网

Scala中循环依赖的解析

Scala中循环依赖的解析,scala,initialization,Scala,Initialization,我一直在Scala中试验循环依赖性杀虫剂 object A { val value:Int = 5 * B.value } object B { val value:Int = 3 * A.value } object Main extends App{ println(A.value) println(B.value) } 执行结果与 0 0 但是当我将val更改为def或lazy val时,我预期会出现一个错误,正如我最初预期的那样,它会导致堆栈溢出 Exceptio

我一直在Scala中试验循环依赖性杀虫剂

object A {
  val value:Int = 5 * B.value
}

object B {
  val value:Int = 3 * A.value
}

object Main extends App{
  println(A.value)
  println(B.value)
}
执行结果与

0
0

但是当我将
val
更改为
def
lazy val
时,我预期会出现一个错误,正如我最初预期的那样,它会导致堆栈溢出

Exception in thread "main" java.lang.StackOverflowError
    at com.experiments.A$.value(Experiments.scala:8)
    at com.experiments.B$.value(Experiments.scala:12)
    at com.experiments.A$.value(Experiments.scala:8)
    at com.experiments.B$.value(Experiments.scala:12)

我猜,它与求值类型有关,其中
val
具有按值调用,而
def
lazy val
具有按名称调用。由于当值具有循环依赖关系时,使用val时会忽略
A.value
B.value
表达式,因此编译器不会进行任何内联,而是生成静态初始化器,初始化将依赖于类加载顺序来计算表达式。 为了更清楚,尝试加法而不是乘法

object A {
   val value:Int = 5 + B.value
 }

object B {
   val value:Int = 3 + A.value
 }

object Main extends App{

   println("A= "+A.value) // 8
   println("B = "+B.value) // 3
}
但是如果你交换电话,结果会是

object Main extends App{

   println("B= "+B.value) // 8
   println("A = "+A.value) // 5
}

使用
-Xcheckinit
可以在运行时获得scala.uninitializedFeldError。是否存在导致死锁的循环初始化问题?