在 GitHub 上編輯此頁面

已移除:封裝物件

封裝物件

package object p {
  val a = ...
  def b = ...
}

將會移除。它們仍然可用,但會在未來的某個時間點被棄用並移除。

封裝物件不再需要,因為現在可以在頂層撰寫各種定義。範例

package p
type Labelled[T] = (String, T)
val a: Labelled[Int] = ("count", 1)
def b = a._2

case class C()

extension (x: C) def pair(y: C) = (x, y)

封裝中可能有多個包含此類頂層定義的原始碼檔案,而且原始碼檔案可以自由地將頂層值、方法和類型定義與類別和物件混合。

編譯器會產生合成物件,以包裝屬於下列類別之一的頂層定義

  • 所有模式、值、方法和類型定義,
  • 隱含類別和物件,
  • 不透明類型別名的伴隨物件。

如果原始碼檔案 src.scala 包含此類頂層定義,它們將會放入名為 src$package 的合成物件中。然而,包裝是透明的。src 中的定義仍然可以作為封裝封裝的成員來存取。合成物件將會放在檔案的最後,在任何其他封裝子句、匯入或物件和類別定義之後。

注意:這表示

  1. 包含已包裝頂層定義的原始碼檔案名稱與二進位相容性有關。如果名稱變更,產生的物件及其類別的名稱也會變更。

  2. 頂層主方法 def main(args: Array[String]): Unit = ... 會像其他方法一樣被包裝。如果它出現在原始檔 src.scala 中,則可以使用類似 scala src$package 的指令從命令列呼叫它。由於「程式名稱」會被破壞,因此建議始終將 main 方法放在明確命名的物件中。

  3. private 的概念與定義是否被包裝無關。private 頂層定義始終可以在封閉套件中的任何地方看到。

  4. 如果多個頂層定義是具有相同名稱的重載變體,則它們都必須來自相同的原始檔。