Scala 3 — 書籍

擴充方法

語言
此文件頁面專門針對 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

本頁面的貢獻者