[英]Scala lazy val interpretation
我正在學習Scala基礎知識。 我剛剛遇到了lazy val
概念。 我有以下代碼片段,它沒有錯誤/警告
lazy val a = 10 + b
lazy val b = 5
println(a)
lazy val a = 10 + b
val b = 5
println(a)
val a = 10 + b
lazy val b = 5
println(a)
我理解case 1 & 2
如何工作的。 但我不明白case 3
的代碼是如何工作的,沒有錯誤/警告。 如何斯卡拉能夠評估價值a
當b
尚未確定?
我沒有在Scala REPL
運行此代碼。 我已將案例3中的代碼保存在名為lazyVal.scala
文件中。 我正在使用scala lazyVal.scala
執行它。 我認為scala會解釋文件中的代碼。
如果我將lazyVal.scala
的代碼lazyVal.scala
為
val a = 10 + b
val b = 5
println(a)
並使用scala lazyVal.scala
執行它我收到警告
/Users/varun.risbud/scalaRepo/src/Chapter1/lazyVal.scala:1: warning: Reference to uninitialized value b
val a = 10 + b
^
one warning found
10
此外,如果我更改代碼以創建對象和擴展應用程序它的工作原理
object lazyVal extends App {
val a = 10 + b
lazy val b = 5
println(a)
}
➜ Chapter1 scalac lazyVal.scala
➜ Chapter1 scala lazyVal
15
我的scala version
是2.12.1
如果這有任何區別。
在構造函數中執行這些語句在文本順序,這就是為什么你會得到一個警告,當初始化a
指的是未初始化b
。 以你甚至沒有得到警告的方式撰寫課程是一個常見的錯誤。 (有關於此的常見問題解答教程。)
在本地語句序列中禁止使用相同的文本:
scala> :pa
// Entering paste mode (ctrl-D to finish)
locally {
val a = 10 + b
lazy val b = 5
println(a)
}
// Exiting paste mode, now interpreting.
<console>:13: error: forward reference extends over definition of value a
val a = 10 + b
^
作為類或對象的成員,在構造期間評估a
時,“按需”評估惰性成員。
scala> :pa
// Entering paste mode (ctrl-D to finish)
object X {
val a = 10 + b
lazy val b = 5
println(a)
}
// Exiting paste mode, now interpreting.
defined object X
scala> X
15
res1: X.type = X$@6a9344f5
腳本運行器以這種方式打包您的代碼行:
object X {
def main(args: Array[String]): Unit =
new AnyRef {
val a = 10 + b
lazy val b = 5
println(a)
}
}
如果你給它一個帶有main
或者擴展App
的對象,它將不會包裝代碼而只是直接使用它。
三種配方之間存在細微差別。 例如,頂級對象的構造函數作為靜態初始化程序運行; 但是一個App
是特殊的,可以將初始化代碼作為main
代碼運行。 (他們正在擺脫App
因為它令人困惑。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.