1

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` { ... }

由于后一个示例将文件名与对象名匹配,并且在包中包含为其定义包对象的文件,因此它看起来更可取。有区别(风格除外)吗?

4

1 回答 1

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,如果我挠了挠下巴,然后“嗯”了一声,我就不用刮胡子了,那就没问题了。

这不是那些 coursera 问题之一,是吗?

于 2012-09-27T18:32:21.410 回答