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は次のように述べています。

標準の命名規則では、上記の定義を、パッケージpに対応するディレクトリにあるpackage.scalaという名前のファイルに配置します。

これは、バッククォート形式が標準の規則ではないことを意味します。

特にコンパイル時の相互作用に関して、十分なユーザーランドガイダンスがないことに同意します。

違いは、デフォルトのパッケージに名前を付けることができないことです。

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

object Foo extends App {
  f()
}

編集:私はバックティックを避けることを好みました(代わりにタブまたはescを押す危険性が高いため)が、コードを1つのソースファイルに入れたいというユースケースがありましたが、パッケージのネストや相対的なパッケージ化も避けたいです、したがってバックティック:

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でデフォルトのパッケージを使用する人は誰ですか:テストコードで見ました。

そして、あなたは「文体以外」と言いましたか?ねえ、それはすべてスタイルについてです。

個人的には、バックティックはヒップですが、あいまいです。毎日10回余分に頭を掻く必要がある場合、年末に髪の毛が少し失われます。

OTOH、あごを引っかいて、剃る必要がないほど「うーん」行ったら、それでいいでしょう。

これはそれらのコースラの質問の1つではありませんか?

于 2012-09-27T18:32:21.410 に答える