2012-09-27 61 views
1

http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html提供了以下示例:如何定義Scala包對象?

// in file gardening/fruits/package.scala 
package gardening 
package object fruits { 
    val planted = List(apple, plum, banana)    
    def showFruit(fruit: Fruit) { 
    println(fruit.name +"s are "+ fruit.color) 
    } 
} 

http://www.scala-lang.org/docu/files/packageobjects/packageobjects_1.html具有:

package gardening.fruits 
object `package` { ... } 

由於後者例如用對象名的文件名相匹配,並且具有在所述包中的文件,其它限定了包對象,它看起來更可取。是否有區別(除了風格)?

回答

2

該規範9.3說:

的標準命名約定是把上面的定義在 文件名爲package.scala多數民衆贊成位於對應 到包裝物P的目錄。

這意味着被反撥的窗體不是標準的約定。

我同意沒有足夠的用戶指導,特別是在編譯時的交互方面。

區別在於您無法命名默認包。

object `package` { 
    def f() = println("Hi") 
} 

object Foo extends App { 
    f() 
} 

編輯:我寧願避免反引號(因爲打標籤或ESC,而不是高危險),但我只是有一個用例,我真的想在一個源文件我的代碼,但我也喜歡避免包嵌套或相對的包裝,因此backticking:

package com.github.maqicode.deprecator 

object `package` { 
    // crashes scalac, actually 
    implicit class MaybeInt(val s: String) extends AnyVal { 
    def toInt_? : Option[Int] = if (s.isEmpty) None else convert 
    private def convert = try { Some(Integer.parseInt(s)) 
    } catch { case _: NumberFormatException => None } 
    } 
} 

// lots of code, so avoid package deprecator { ... } 

case class Version(major: Int, minor: Option[Int], point: Option[Int], descriptor: String) 

object Version { 
    val version = """(\d+)(?:\.(\d+))?(?:\.(\d+))?(.*)""".r 
    def apply(descriptor: String): Version = { 
    val version(major, minor, point, rest) = descriptor 
    Version(major.toInt, minor.toInt_?, point.toInt_?, descriptor) 
    } 
} 

至於隱含的問題,誰曾經使用默認的包斯卡拉:我看到了它的測試代碼。

你有沒有說「除了風格」?嘿,這全是關於風格。

就我個人而言,我發現反斜槓但不明顯。如果我必須每天額外抓十次頭,那麼在今年年底,我會失去一些頭髮。

OTOH,如果我劃傷了下巴,並且「唔」夠了,我不必刮鬍子,那也沒關係。

這不是那些課程中的一個問題,是嗎?

+0

這不是Coursera的問題,但包裝對象的主題是在Coursera研究小組中提出的。我不知道包裝物品,所以我做了一些研究,發現兩種不同的樣式,沒有關於親和物的指導。就個人而言,我不介意反引號(如果調用恰好是Scala中的關鍵字的Java函數(例如'yield'),則無論如何都需要反引號)。 –