规范 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,如果我挠了挠下巴,然后“嗯”了一声,我就不用刮胡子了,那就没问题了。
这不是那些 coursera 问题之一,是吗?