2013-02-13 55 views
3

正如問題標題所述,訪問type的成員是否會導致該成員的評估?或者它只是使用它的靜態類型?訪問lazy val的類型是否會導致它被評估?

這裏是其中我有一個implicit lazy val的示例代碼,我想在與該類型的接受implicit val的方法使用它的類型:

implicit lazy val nonSpaces: Array[(Point, Part)]

.. 。

def randomNonSpaceCoordinate(implicit nonSpaces: this.nonSpaces.type): Point = nonSpaces(Utils.Random.randUpTo(nonSpaces.length))._1

回答

5

讓我們來看看:

scala> object Test { 
    | lazy val test: String = {println("bang!"); "value"} 
    | val p: this.test.type = null 
    | def testDef(p: this.test.type) = println(p) 
    | } 
defined module Test 

scala> Test.testDef(Test.p) 
null 

scala> Test.testDef(Test.test) 
bang! 
value 

因此,大家可以看到剛剛訪問類型不需要懶惰VAL實際進行評估。

+0

我得到了我的答案,謝謝。我認爲我很懶,因爲我也可以嘗試。但是將它作爲StackOverflow中的QA很好,對不對? 所以只需訪問該類型不需要實際評估惰性val。你能編輯你的答案來包含這個聲明嗎? 謝謝。 – ciuncan 2013-02-13 15:02:31

5

編號類型的計算(除了他們的影子自己「反射」)是編譯時的事情。然而

scala> lazy val lv1 = { println("Initializing lv1"); "lv1" } 
lv1: String = <lazy> 

scala> def m1(s: lv1.type): Int = s.length 
m1: (s: lv1.type)Int 

scala> lv1 
Initializing lv1 
res5: String = lv1 

,你可能要更加仔細地考慮使用.type這樣的,因爲它是一個所謂的路徑depedent型和類似情況:

您可以驗證這樣的事情這一點,可能是過於狹窄是有用的:

scala> m1(lv1) 
res6: Int = 3 

scala> m1("42") 
<console>:10: error: type mismatch; 
found : String("42") 
required: lv1.type 
       m1("42") 

在你的情況,你只能夠調用randomNonSpaceCoordinatenonSpaces,使得它有點無謂至p完全可以把它作爲一個論點。

+0

我不明白爲什麼第二次調用m1失敗,是不是lv1.type alread字符串?它如何更具體?看起來'類型'不是我所理解的。你會建議什麼?我想與我的隱式val作爲參數具有相同的類型,因爲我將使用本地val替代方法。例如,如果我使用與隱式val相同的類型表達式聲明它們,那麼可以嗎? – ciuncan 2013-02-13 15:17:27

+2

這就是我的觀點。它是'字符串',它是'nonSpaces'的類型_specifically_和沒有其他'字符串'。因此術語「路徑依賴型」。 – 2013-02-13 15:22:01

+0

啊,好的。所以這對我來說真的沒什麼用處。我將不得不考慮路徑依賴型主題。目前我不知道哪個答案標記爲「答案」,因爲兩者都是正確的,這是對我的問題的一個具體而有用的答案;另一方面,@senia的例子就是直接回答這個問題。 :) 有什麼建議麼? – ciuncan 2013-02-13 15:36:46

相關問題