http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html提供了以下示例:
// 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` { ... }
由于后一个示例将文件名与对象名称匹配,并且文件在包中为其定义包对象,因此看起来更为可取。是否存在差异(风格除外)?
答案 0 :(得分:2)
规范9.3说:
标准命名约定是将上面的定义放在一个 名为package.scala的文件位于相应的目录中 打包p。
这意味着反推的表格不是标准惯例。
我同意没有足够的用户态指导,特别是在编译时交互方面。
不同之处在于您无法命名默认包。
object `package` {
def f() = println("Hi")
}
object Foo extends App {
f()
}
编辑:我更喜欢避免反引号(因为碰到tab或esc的危险很大),但我只是有一个用例,我真的希望我的代码在一个源文件中,但我也更喜欢避免包嵌套或相对包装,因此反刺:
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)
}
}
至于隐含的问题,谁曾在Scala中使用默认包:我在测试代码中看到了它。
你说“除了文体”吗?嘿,这都是关于风格的。
就我个人而言,我发现反推臀部但是模糊不清。如果我每天不得不额头十次,在年底,我会失去一些头发。
OTOH,如果我划伤我的下巴并且“嗯”足以让我不必刮胡子,那就没关系了。这不是其中一个问题,是吗?