此文件頁面專門針對 Scala 3,可能涵蓋 Scala 2 中沒有的新概念。除非另有說明,此頁面中的所有程式碼範例都假設您使用 Scala 3。
在 Scala 2 中,可以使用 隱含類別 達到類似的結果。
擴充方法讓您可以在定義類型後新增方法到該類型,換句話說,它們讓您新增方法到封閉類別。例如,想像一下其他人建立了一個 Circle
類別
case class Circle(x: Double, y: Double, radius: Double)
現在想像一下您需要一個 circumference
方法,但您無法修改他們的原始碼。在術語推論概念被引入程式語言之前,您唯一能做的事就是像這樣在一個獨立的類別或物件中撰寫一個方法
object CircleHelpers {
def circumference(c: Circle): Double = c.radius * math.Pi * 2
}
object CircleHelpers:
def circumference(c: Circle): Double = c.radius * math.Pi * 2
然後您會像這樣使用該方法
val aCircle = Circle(2, 3, 5)
// without extension methods
CircleHelpers.circumference(aCircle)
但使用擴充方法,您可以建立一個 circumference
方法來處理 Circle
實例
extension (c: Circle)
def circumference: Double = c.radius * math.Pi * 2
在此程式碼中
Circle
是擴充方法circumference
將被新增到的類型c: Circle
語法讓您可以在擴充方法中參照變數c
然後在您的程式碼中,您使用 circumference
就好像它原本定義在 Circle
類別中一樣
aCircle.circumference
匯入擴充方法
想像一下,circumference
定義在套件 lib
中,您可以透過以下方式匯入它
import lib.circumference
aCircle.circumference
如果遺漏匯入,編譯器也會透過顯示詳細的編譯錯誤訊息來協助您,例如以下
value circumference is not a member of Circle, but could be made available as an extension method.
The following import might fix the problem:
import lib.circumference
討論
extension
關鍵字宣告您即將在放入括號中的類型上定義一個或多個擴充方法。若要在類型上定義多個擴充方法,請使用此語法
extension (c: Circle)
def circumference: Double = c.radius * math.Pi * 2
def diameter: Double = c.radius * 2
def area: Double = math.Pi * c.radius * c.radius
本頁面的貢獻者
內容
- 簡介
- Scala 特色
- 為什麼選擇 Scala 3?
- Scala 淺嚐
- Hello, World!
- REPL
- 變數和資料類型
- 控制結構
- 網域建模
- 方法
- 一級函式
- 單例物件
- 集合
- 情境抽象
- 頂層定義
- 摘要
- 類型初探
- 字串插補
- 控制結構
- 網域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特色
- Scala 3 中的 Main 方法
- 摘要
- 函式
- 匿名函式
- 函式變數
- Eta 展開
- 高階函式
- 撰寫自己的 map 方法
- 建立回傳函式的函式
- 摘要
- 封裝和匯入
- Scala 集合
- 集合類型
- 集合方法
- 摘要
- 函式程式設計
- 什麼是函式程式設計?
- 不可變值
- 純函式
- 函式即值
- 函式錯誤處理
- 摘要
- 類型和類型系統
- 推論類型
- 泛型
- 交集類型
- 聯集類型
- 代數資料類型
- 變異性
- 不透明類型
- 結構類型
- 依賴函式類型
- 其他類型
- 情境抽象
- 擴充方法
- 情境參數
- 情境限制
- Given 匯入
- 類型類別
- 多重宇宙等號
- 隱式轉換
- 摘要
- 並行
- Scala 工具
- 使用 sbt 建置和測試 Scala 專案
- 工作表
- 與 Java 互動
- Java 開發人員的 Scala
- JavaScript 開發人員的 Scala
- Python 開發人員的 Scala
- 下一步該去哪裡