Scala 3 — Book

Методы

Language

Методы в Scala

Классы Scala, case-классы, трейты, перечисления и объекты могут содержать методы. Синтаксис простого метода выглядит так:

def methodName(param1: Type1, param2: Type2): ReturnType =
  // тело метода
  // находится здесь

Вот несколько примеров:

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://localhost")         // url=http://localhost, timeout=5000
makeConnection("https://localhost", 2500)   // url=http://localhost, timeout=2500

Scala также поддерживает использование именованных параметров при вызове метода, поэтому вы можете вызвать этот метод, если хотите, вот так:

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

Именованные параметры особенно полезны, когда несколько параметров метода имеют один и тот же тип. Глядя на этот метод можно задаться вопросом, какие параметры установлены в true или false:

engage(true, true, true, false)

Ключевое слово extension объявляет о намерении определить один или несколько методов расширения для параметра, заключенного в круглые скобки. Как показано в этом примере, параметр s типа String можно затем использовать в теле методов расширения.

В следующем примере показано, как добавить метод 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 могут быть гораздо более мощными: они могут принимать параметры типа и параметры контекста. Методы подробно описаны в разделе “Моделирование предметной области”.

Contributors to this page: