2012-07-25 22 views
1

我想了解的優先級上綁定93頁的約書亞Suareth的書斯卡拉深入第四屆規則。試圖瞭解Scala的優先權第4詳解書

,根據這一規則:由包條款沒有在定義時有優先級最低的源文件可用

定義。

正是這個規則,我打算測試。

所以關我去,並試圖遵循第94頁。思想的Josh的火車,他創建了一個名爲externalbindings.scala源文件,我也一樣,用了一些更改,如下

package com.att.scala 

class extbindings { 
    def showX(x: Int): Int = { 
    x 
    } 

    object x1 { 
    override def toString = "Externally bound obj object in com.att.scala" 
    } 
} 

下一頁他要求我們創建另一個文件,以便我們測試上述規則。我創建了一個名爲precedence.scala:

package com.att.scala 

class PrecedenceTest { //Josh has an object here instead of a class 

    def testPrecedence(): Unit = { //Josh has main method instead of this 
    testSamePackage() 
    //testWildCardImport() 
    //testExplicitImport() 
    //testInlineDefinition() 
    } 

    println("First statement of Constructor") 
    testPrecedence 
    println("Last statement of Constructor") 

    def testSamePackage() { 
    val ext1 = new extbindings() 
    val x = ext1.showX(100) 
    println("x is "+x) 
    println(obj1) // Eclipse complains here 
    } 
} 

現在,約什是能夠通過簡單地做在REPL的<package-name>.<object-name>.testSamePackage方法來打印出他的榜樣對象的值。 他的輸出是:

外部約束在封裝測試

在我的版本x對象,該文件是在Eclipse中,我有我的嵌入式斯卡拉解釋。

Eclipse的抱怨就在這裏:println(obj),它說:not found value obj1

我做得顯然是錯誤的設置測試文件? 我想能夠測試我上面提到的規則和得到的輸出:

外部約束的obj對象中封裝com.att.scala

回答

4

我沒有讀過書,因此我不確定你的代碼是否顯示了本書想告訴你的內容。

儘管如此,錯誤信息是正確的。找不到obj1,因爲它不存在。在你的代碼中,它被稱爲x1。因爲它是extbindings成員必須訪問它,因爲這類的成員:

println(ext1.x1) 

如果x1extbinding類之外定義,在包com.att.scala的範圍,就可以直接訪問它:

println(x1) 

如果在另一個包中定義你面前放包名稱:

println(com.att.scala2.x1) 

爲了簡化等等我的東西,你可以導入x1

import ext1.x1 
println(x1) 

最後一個提示,以提高你的代碼:名稱類型UpperCamelCaseextbindings - >Extbindingsx1 - >X1

+0

我很高興你指出了這一點。我犯的錯誤是讓對象obj1成爲類的extbindings成員。你所有的解釋都很清楚,內容豐富。 – ilango 2012-07-25 16:03:14

+0

我將實施您所建議的改進。 – ilango 2012-07-25 16:12:17

3

如果用一個類替代一個單身的對象,您將需要創建該類的一個實例。

+0

你說得對。我欣賞你的及時迴應 – ilango 2012-07-25 16:03:36