令人興奮的 Scala 3 新版本帶來許多改善和新功能。在此,我們將快速概觀最重要的變更。如果您想深入了解,我們提供了一些參考供您使用
- Scala 3 書籍 針對 Scala 語言的新手開發人員。
- 語法摘要 提供新語法的正式說明。
- 語言參考 詳細說明從 Scala 2 到 Scala 3 的變更。
- 遷移指南 提供從 Scala 2 移轉到 Scala 3 所需的所有資訊。
- Scala 3 貢獻指南 深入探討編譯器,包括修復問題的指南。
Scala 3 的新功能
Scala 3 是 Scala 語言的全面改造。在核心部分,許多類型系統的層面都已變更,以符合更多原則。雖然這也帶來令人興奮的新功能(例如聯合類型),但首先且最重要的是,這表示類型系統會(更)少阻礙您,例如 類型推論 和重載解析已大幅改善。
新穎且閃亮:語法
除了許多(次要的)清理之外,Scala 3 語法提供了以下改進
- 類似
if
、while
和for
的控制結構的「安靜」新語法(新的控制語法) new
關鍵字是可選的(又稱 建立應用程式)- 可選大括號,支援不受干擾、對縮排敏感的程式設計風格
- 將 類型層通配符 從
_
變更為?
。 - 隱含(及其語法)已被 大幅修改。
觀點:脈絡抽象
Scala 的一個基本核心概念是(而且在某種程度上仍然是)為使用者提供一組強大的功能,這些功能可以組合成強大(有時甚至無法預見)的表達能力。例如,隱含功能已用於建模脈絡抽象、表達類型層運算、建模類型類別、執行隱含強制轉換、編碼擴充方法等等。從這些使用案例中學習,Scala 3 採取了略微不同的方法,並專注於意圖而非機制。Scala 3 沒有提供一個非常強大的功能,而是提供了多個客製化語言功能,讓程式設計人員可以直接表達他們的意圖
-
抽象化脈絡資訊。使用子句允許程式設計人員抽象化呼叫脈絡中可用的資訊,並且應隱含傳遞。作為對 Scala 2 隱含的改進,可以使用子句按類型指定,從從未明確引用的術語變數名稱中釋放函式簽章。
-
提供類型類別實例。已給予實例允許程式設計人員定義特定類型的正規值。這使得使用類型類別的程式設計更為直接,而不會洩漏實作細節。
-
追溯擴充類別。在 Scala 2 中,必須使用隱含轉換或隱含類別來編碼擴充方法。相比之下,在 Scala 3 中,擴充方法現在直接建置在語言中,可產生更好的錯誤訊息和改進的類型推論。
-
將一種類型視為另一種類型。隱含轉換已從頭開始 重新設計為類型類別
Conversion
的實例。 -
高階脈絡抽象。全新的 脈絡函數 功能讓脈絡抽象成為一級公民。它們是程式庫作者的重要工具,並允許表達簡潔的特定領域語言。
-
編譯器提供的可操作回饋。如果編譯器無法解析隱含參數,它現在會提供 匯入建議,這些建議可能會解決問題。
言簡意賅:類型系統改進
除了大幅改善類型推論之外,Scala 3 類型系統還提供了許多新功能,為您提供了強大的工具,可以在類型中靜態表達不變式
-
不透明類型。在 不透明類型別名 後面隱藏實作細節,而不會影響效能!不透明類型取代值類別,並允許您設定抽象障礙,而不會造成額外的封裝開銷。
-
交集和聯集類型。將類型系統建立在新的基礎上,引入了新的類型系統功能:交集類型 的實例,例如
A & B
,是A
和B
兩者的實例。 聯集類型 的實例,例如A | B
,是A
或B
任一的實例。這兩種結構都允許程式設計師靈活地表達繼承層次結構之外的類型約束。 -
相依函數類型。Scala 2 已經允許回傳類型取決於(值)引數。在 Scala 3 中,現在可以抽象出這個模式並表達 相依函數類型。在類型
type F = (e: Entry) => e.Key
中,結果類型取決於引數! -
多型函數類型。與相依函數類型一樣,Scala 2 支援允許類型參數的方法,但不允許程式設計師抽象出這些方法。在 Scala 3 中,多型函數類型 例如
[A] => List[A] => List[A]
可以抽象出除了值引數之外,還採用類型引數的函數。 -
類型 lambda。在 Scala 2 中使用 編譯器外掛程式 表達所需內容,現在已成為 Scala 3 中的一流功能:類型 lambda 是類型層級函式,可以傳遞為 (高階) 類型參數,而不需要輔助類型定義。
-
比對類型。Scala 3 提供 比對類型 的直接支援,而不是使用隱式解析編碼類型層級計算。將類型層級計算整合到類型檢查器中,可以改善錯誤訊息,並消除對複雜編碼的需求。
重新構想:物件導向程式設計
Scala 一直處於函式程式設計和物件導向程式設計之間的前沿,而 Scala 3 在兩個方向上都突破了界限!上述類型系統變更和情境抽象的重新設計,讓函式程式設計比以往更容易。同時,以下新穎功能支援結構良好的物件導向設計,並支援最佳實務。
- 傳遞下去。特質更接近類別,現在也可以接受 參數,讓它們成為模組化軟體分解更強大的工具。
- 規劃擴充。擴充未打算擴充的類別,是物件導向設計中長久以來的問題。為了解決這個問題,開放類別 要求函式庫設計人員明確地將類別標記為開放。
- 隱藏實作細節。實作行為的工具特質有時不應該是推斷類型的一部分。在 Scala 3 中,這些特質可以標記為 透明,對使用者隱藏繼承 (在推斷類型中)。
- 組合優於繼承。這句話經常被引用,但實作起來很繁瑣。Scala 3 的 匯出子句 就不一樣:與匯入對稱,匯出子句允許使用者為物件的選取成員定義別名。
- 沒有更多 NPE(實驗性)。Scala 3 比以往更安全:明確 null 將
null
移出類型階層,協助您在靜態中捕捉錯誤;安全初始化 的額外檢查會偵測未初始化物件的存取。
內含電池:元程式設計
雖然 Scala 2 中的巨集僅為實驗性功能,但 Scala 3 附帶了強大的元程式設計工具。 巨集教學 中包含有關不同設施的詳細資訊。特別是,Scala 3 提供下列元程式設計功能
- 內嵌。作為基本起點,內嵌功能 允許在編譯時簡化值和方法。此簡單功能已涵蓋許多使用案例,同時也提供進階功能的入門點。
- 編譯時運算。套件
scala.compiletime
包含可用于實作內嵌方法的其他功能。 - 引號程式碼區塊。Scala 3 新增 類引號 的新功能,提供方便的高階介面來建構和分析程式碼。建構用於加法的一加一的程式碼就像
'{ 1 + 1 }
一樣簡單。 - 反射 API。對於更進階的使用案例,quotes.reflect 提供更詳細的控制來檢查和產生程式樹。
如果您想進一步了解 Scala 3 中的元程式設計,我們邀請您參加我們的 教學。