Методы в 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:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java