簡體   English   中英

斯卡拉懶惰的解釋

[英]Scala lazy val interpretation

我正在學習Scala基礎知識。 我剛剛遇到了lazy val概念。 我有以下代碼片段,它沒有錯誤/警告

情況1

lazy val a = 10 + b
lazy val b = 5
println(a)

案例2

lazy val a = 10 + b
val b = 5
println(a)

案例3

val a = 10 + b
lazy val b = 5
println(a)

我理解case 1 & 2如何工作的。 但我不明白case 3的代碼是如何工作的,沒有錯誤/警告。 如何斯卡拉能夠評估價值ab尚未確定?

編輯

我沒有在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 version2.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM