在 GitHub 上編輯此頁面

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 中支援,稍後會標示為不建議使用並逐步淘汰

變更

這些結構已進行變更,以使其更常規且更實用。

  • 結構類型:現在允許可插入的實作,大幅提高其實用性。與現狀相比,有些用法模式受到限制。
  • 基於名稱的模式比對:現有的未記錄 Scala 2 實作已以略微簡化的形式編纂。
  • 自動 Eta 展開:Eta 展開現在普遍執行,即使沒有預期的類型。因此,後綴 _ 算子變得多餘。它將在 Scala 3.0 之後標示為不建議使用並棄用。
  • 隱式解析:隱式解析規則已清理,使其更實用且更不容易令人意外。隱式範圍已限制,不再包含套件字首。

舊式隱式解析的大部分面向在 -source 3.0-migration 下仍可用。此清單中的其他變更會無條件套用。

新結構

這些是讓語言更強大或更易於使用的新增功能。

  • 列舉提供簡潔的語法,用於列舉和代數資料類型
  • 參數解組避免在元組參數解構中使用 case
  • 依賴函數類型將依賴方法概括為依賴函數值和類型。
  • 多態函數類型將多態方法概括為多態函數值和類型。當前狀態:有一個建議和一個已合併的原型實作,但實作尚未完成(特別是缺少類型推論支援)。
  • 種類多態允許定義在類型和類型建構函數上運作的運算子。
  • @targetName 註解讓與以其他語言編寫的程式碼互動變得更簡單,並提供更多彈性來避免名稱衝突。

元程式設計

以下結構共同旨在將 Scala 中的元程式設計置於新基礎上。到目前為止,元程式設計是透過巨集和函式庫(例如 Shapeless)的組合來實現的,而這些函式庫又是基於一些關鍵巨集。目前的 Scala 2 巨集機制是在目前的 Scala 2 編譯器上的一層薄貼面,這使得它們脆弱且在許多情況下無法移植到 Scala 3。

值得注意的是,巨集從未包含在 Scala 2 語言規範 中,到目前為止僅在 -experimental 標記下提供。這並未阻止它們廣泛使用。

為了能夠移植巨集的大部分用途,我們正在嘗試使用下面列出的進階語言結構。這些設計比 Scala 3.0 提議的其他語言結構更具暫時性。在最終版本之前可能仍有一些變更。穩定元程式設計所需的特性集是我們的首要任務。

  • 比對類型允許在類型上進行運算。
  • Inline 本身提供一些簡單巨集的直接實作,同時也是實作複雜巨集的基本建構模組。
  • 引號和拼接 提供一個有原則的方式來表達巨集和分段,並使用一組統一的抽象。
  • 類型類別推導 提供 Shapeless 和其他基礎函式庫中 Gen 巨集的語言內實作。新的實作比巨集更強健、更有效率且更易於使用。
  • 依名稱而定的內容參數 提供 ShapelessLazy 巨集更強健的語言內實作。

另請參閱

建議語言功能的分類 是此頁面的擴充版本,增加了狀態(即成為 Scala 3 的相對重要性,以及決定此狀態的相對急迫性)和每種語言建構的預期遷移成本。