簡體   English   中英

Scala lazy val緩存

[英]Scala lazy val caching

在以下示例中:

def maybeTwice2(b: Boolean, i: => Int) = {
  lazy val j = i
  if (b) j+j else 0
}

當我稱之為喜歡時,為什么不打印兩次:

maybeTwice2(true, { println("hi"); 1+41 })

這個例子實際上來自“Scala中的函數式編程”一書,以及為什么“hi”沒有被打印兩次的原因對我來說不夠有說服力。 所以只想到這里問這個!

所以i是一個給出整數的函數嗎? 當您調用方法時,將b傳遞為true,並執行if語句的第一個分支。

發生的是j被設置為i並且第一次稍后在計算中使用它執行函數,打印“hi”並緩存結果值1 + 41 = 42 第二次使用它時,已經計算了結果值,因此函數返回84,而不需要因為lazy val j而計算兩次函數。

這個SO答案探討了如何在內部實現惰性val。 j + jj是一個惰性val,它相當於一個函數,它執行你為lazy val的定義提供的代碼,返回一個整數並將其緩存以供進一步調用。 所以它打印hi並返回1+41 = 42 然后評估第二個j ,並調用相同的函數。 除此之外,它不是運行代碼,而是從緩存中獲取值(42)。 然后添加兩個整數(返回84)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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