Scala 3 參考文件
Scala 3 實作許多語言變更,並改善 Scala 2。在此參考中,我們討論設計決策,並提出與 Scala 2 相比的重要差異。
目標
語言重新設計受到三個主要目標的指導
- 強化 Scala 的基礎。讓完整的程式語言與 DOT 微積分 的基礎工作相容,並套用從該工作中學到的教訓。
- 讓 Scala 更容易、更安全地使用。馴服強大的建構,例如隱含,以提供更平緩的學習曲線。移除缺陷和難題。
- 進一步改善 Scala 語言建構的一致性和表達性。
根據這些目標,語言變更分為七類:(1) 強化基礎的核心建構,(2) 簡化和 (3) 限制,讓語言更易於使用且更安全,(4) 已刪除的建構,讓語言更精簡且更規律,(5) 已變更的建構,移除缺陷並增加一致性和可用性,(6) 新的建構,填補空白並增加表達性,(7) 一個新的、有原則的元程式設計方法,取代 Scala 2 實驗性巨集。
必要的基礎
這些新的建構直接建構 DOT、高階類型和 隱含解析的 SI 微積分 的核心功能。
簡化
這些結構取代現有結構,目的是讓語言更安全、更易於使用,並促進程式碼樣式的統一性。
- 特質參數 以更通用的有用結構取代早期初始化器。
- 給定實例 取代隱式物件和 def,專注於意圖而非機制。
- using 子句 取代隱式參數,避免其模稜兩可性。
- 擴充方法 以更清晰、更簡單的機制取代隱式類別。
- 不透明類型別名 取代大多數值類別的用途,同時保證沒有封裝。
- 頂層定義 取代套件物件,捨棄語法樣板。
- 匯出子句 提供一種簡單且通用的方式來表達聚合,這可以取代套件物件繼承自類別的先前外觀模式。
- 變數參數拼接 現在在函數參數和模式中使用
xs*
形式,而不是xs: _*
和xs @ _*
, - 通用套用方法 允許使用簡單的函數呼叫語法,而不是
new
表達式。new
表達式作為備用方案保留,用於無法使用建立應用程式的案例。
除了早期初始化器 和舊式變數參數模式之外,所有取代的結構在 Scala 3.0 中仍然可用。計畫是將它們標示為過時並在稍後階段淘汰。
值類別(已由不透明類型別名取代)是一個特例。目前沒有棄用值類別的計畫,因為如果 JVM 原生支援值類別,我們可能會以更通用的形式將其帶回,就像 專案 Valhalla 所計畫的那樣。
限制
這些結構受到限制,以提升語言安全性。
- 隱式轉換:僅有一種方式可以定義隱式轉換,而不是許多方式,而且潛在令人驚訝的隱式轉換需要語言匯入。
- 已給予匯入:隱式現在需要特殊形式的匯入,以使匯入清楚可見。
- 類型投影:只有類別可以用作類型投影
C#A
的前置C
。不再支援抽象類型上的類型投影,因為它不健全。 - 多重世界等式:實作「選擇加入」方案,以排除使用
==
和!=
進行無意義的比較。 - 中置:讓方法應用程式碼在所有程式碼庫中一致。
不受限制的隱式轉換在 Scala 3.0 中仍然可用,但稍後將會棄用並移除。上述清單中其他結構的不受限制版本僅在 -source 3.0-migration
下可用。
已移除的結構
建議移除這些結構,而沒有新的結構取代它們。移除這些結構的動機是簡化語言及其實作。
這些結構的棄用日期各不相同。目前狀態為
- 尚未實作
- DelayedInit、存在類型、弱一致性。
- 在
-source 3.0-migration
下支援- 程序語法、類別陰影、符號文字、自動應用、受限形式的自動元組化。
- 在 3.0 中支援,稍後會標示為不建議使用並逐步淘汰
- XML 文字、複合類型。
變更
這些結構已進行變更,以使其更常規且更實用。
- 結構類型:現在允許可插入的實作,大幅提高其實用性。與現狀相比,有些用法模式受到限制。
- 基於名稱的模式比對:現有的未記錄 Scala 2 實作已以略微簡化的形式編纂。
- 自動 Eta 展開:Eta 展開現在普遍執行,即使沒有預期的類型。因此,後綴
_
算子變得多餘。它將在 Scala 3.0 之後標示為不建議使用並棄用。 - 隱式解析:隱式解析規則已清理,使其更實用且更不容易令人意外。隱式範圍已限制,不再包含套件字首。
舊式隱式解析的大部分面向在 -source 3.0-migration
下仍可用。此清單中的其他變更會無條件套用。
新結構
這些是讓語言更強大或更易於使用的新增功能。
元程式設計
以下結構共同旨在將 Scala 中的元程式設計置於新基礎上。到目前為止,元程式設計是透過巨集和函式庫(例如 Shapeless)的組合來實現的,而這些函式庫又是基於一些關鍵巨集。目前的 Scala 2 巨集機制是在目前的 Scala 2 編譯器上的一層薄貼面,這使得它們脆弱且在許多情況下無法移植到 Scala 3。
值得注意的是,巨集從未包含在 Scala 2 語言規範 中,到目前為止僅在 -experimental
標記下提供。這並未阻止它們廣泛使用。
為了能夠移植巨集的大部分用途,我們正在嘗試使用下面列出的進階語言結構。這些設計比 Scala 3.0 提議的其他語言結構更具暫時性。在最終版本之前可能仍有一些變更。穩定元程式設計所需的特性集是我們的首要任務。
另請參閱
建議語言功能的分類 是此頁面的擴充版本,增加了狀態(即成為 Scala 3 的相對重要性,以及決定此狀態的相對急迫性)和每種語言建構的預期遷移成本。