Why can't i define a variable recursively in a code block?

前端 未结 4 1139
花落未央
花落未央 2020-12-19 02:35

Why can\'t i define a variable recursively in a code block?

scala> {
     | val test: Stream[Int] = 1 #:: test
     | }
:9: error: forward          


        
4条回答
  •  天命终不由人
    2020-12-19 02:58

    The reason for this behavior depends on different val initialization times. If you type val x = 5 directly to the REPL, x becomes a member of an object, which values can be initialized with a default value (null, 0, 0.0, false). In contrast, values in a block can not initialized by default values.

    This tends to different behavior:

    scala> class X { val x = y+1; val y = 10 }
    defined class X
    
    scala> (new X).x
    res17: Int = 1
    
    scala> { val x = y+1; val y = 10; x } // compiles only with 2.9.0
    res20: Int = 11
    

    In Scala 2.10 the last example does not compile anymore. In 2.9.0 the values are reordered by the compiler to get it to compile. There is a bug report which describes the different initialization times.

提交回复
热议问题