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: