Scala 3 — 書籍

方法

語言

Scala 方法

Scala 類別、案例類別、特質、列舉和物件都可以包含方法。簡單方法的語法如下所示

def methodName(param1: Type1, param2: Type2): ReturnType =
  // the method body
  // goes here

以下是一些範例

def sum(a: Int, b: Int): Int = a + b
def concatenate(s1: String, s2: String): String = s1 + s2

您不必宣告方法的回傳類型,因此如果您願意,可以用這種方式撰寫這些方法

def sum(a: Int, b: Int) = a + b
def concatenate(s1: String, s2: String) = s1 + s2

以下是呼叫這些方法的方式

val x = sum(1, 2)
val y = concatenate("foo", "bar")

以下是多行方法的範例

def getStackTraceAsString(t: Throwable): String = {
  val sw = new StringWriter
  t.printStackTrace(new PrintWriter(sw))
  sw.toString
}
def getStackTraceAsString(t: Throwable): String =
  val sw = new StringWriter
  t.printStackTrace(new PrintWriter(sw))
  sw.toString

方法參數也可以有預設值。在此範例中,timeout 參數的預設值為 5000

def makeConnection(url: String, timeout: Int = 5000): Unit =
  println(s"url=$url, timeout=$timeout")

由於方法宣告中提供了預設 timeout 值,因此可以透過這兩種方式呼叫方法

makeConnection("https://127.0.0.1")         // url=https://127.0.0.1, timeout=5000
makeConnection("https://127.0.0.1", 2500)   // url=https://127.0.0.1, timeout=2500

Scala 也支援在呼叫方法時使用命名參數,因此如果您願意,也可以用這種方式呼叫該方法

makeConnection(
  url = "https://127.0.0.1",
  timeout = 2500
)

當多個方法參數具有相同的類型時,命名參數特別有用。乍看之下,對於這個方法,您可能會想知道哪些參數設定為 truefalse

engage(true, true, true, false)

extension 關鍵字宣告您即將在括號中放入的參數上定義一個或多個擴充方法。如範例所示,類型為 String 的參數 s 可以在擴充方法的主體中使用。

下一個範例顯示如何將 makeInt 方法新增到 String 類別。在此,makeInt 採用名為 radix 的參數。程式碼未考量可能發生的字串轉換為整數的錯誤,但跳過這些細節,範例顯示其運作方式

extension (s: String)
  def makeInt(radix: Int): Int = Integer.parseInt(s, radix)

"1".makeInt(2)      // Int = 1
"10".makeInt(2)     // Int = 2
"100".makeInt(2)    // Int = 4

另請參閱

Scala 方法可以強大許多:它們可以採用類型參數和內容參數。它們在 網域建模 區段中詳細介紹。

此頁面的貢獻者