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