已移除:封裝物件
封裝物件
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
中的定義仍然可以作為封裝封裝的成員來存取。合成物件將會放在檔案的最後,在任何其他封裝子句、匯入或物件和類別定義之後。
注意:這表示
-
包含已包裝頂層定義的原始碼檔案名稱與二進位相容性有關。如果名稱變更,產生的物件及其類別的名稱也會變更。
-
頂層主方法
def main(args: Array[String]): Unit = ...
會像其他方法一樣被包裝。如果它出現在原始檔src.scala
中,則可以使用類似scala src$package
的指令從命令列呼叫它。由於「程式名稱」會被破壞,因此建議始終將main
方法放在明確命名的物件中。 -
private
的概念與定義是否被包裝無關。private
頂層定義始終可以在封閉套件中的任何地方看到。 -
如果多個頂層定義是具有相同名稱的重載變體,則它們都必須來自相同的原始檔。