2015-06-04 16 views
0

我在一個包/目錄中有多個類文件。與此相似:導入到所有包成員文件(包範圍)

文件1:

package model 
import same.library 
class File1Class {}[...] 

文件2:

package model 
import same.library 
class File2Class {}[...] 

等等

停留package model一部分已經允許每個成員訪問所有package model -defined類,所以我想知道是否有辦法將其擴展到導入,有效避免在每個文件中寫入import same.library,如果該庫是在整個包裹中需要?

+0

AFAIK這是不可能的。但是,在每個文件的頂部都有導入語句沒有任何問題。 – Roman

+0

啊。那真不幸。是的,我同意它沒有錯,但它似乎完全可以避免。 – TimY

回答

3

我認爲這是不值得的努力,但「只爲科學」:

可以使用包對象絕招:

定義的別名導入的庫是否它是一個對象,類型或功能(由scala.Predef啓發):

package object test { 
    def pow = scala.math.pow _ 
} 

,然後所有這些包對象構件是自動可用而不在同一封裝中導入:

package test 

object TestIt { 
    val r = pow(2, 3) 
} 

以類似的方式,你可以通過暗示使用另一種方式。

定義轉換/操作,你的庫確實爲暗示:

package object test { 
    implicit def strToInt(str: String): Int = str.length 
} 

隱含使用它:

package test 
object TestIt { 
    val strLength: Int = "abc" 
} 

Implicits沒有被放置在包對象,看到的隱式解析對於斯卡拉發現暗示的其他地方。

還有一個選擇是使用功能範圍,或者你可以用同樣的方式對象範圍:

package test 

trait Library { 
    def doSmth: String = "It works" 
} 
object Library extends Library 

object Scope { 
    def libraryScope[T](codeBlock: Library => T): T = { 
    codeBlock(Library) 
    } 
} 

,然後用它是這樣的:

package test 

object SecondTest { 
    Scope.libraryScope { lib => lib.doSmth } 
} 

在所有3種情況下,你避免在其他地方使用導入一次。除非有特殊情況,否則所有這些選項都不會使您的代碼更加清晰。