В Скале операторы - это обычные методы. В качестве инфиксного оператора может быть использован любой метод с одним параметром. Например, +
может вызываться с использованием точки:
10.+(1)
Однако легче воспринимать код, когда такие методы записаны как инфиксный оператор:
10 + 1
Создание и использование операторов
В качестве оператора можно использовать любой допустимый символ. Включая имена на подобии add
или символ (символы) типа +
.
case class Vec(x: Double, y: Double) {
def +(that: Vec) = Vec(this.x + that.x, this.y + that.y)
}
val vector1 = Vec(1.0, 1.0)
val vector2 = Vec(2.0, 2.0)
val vector3 = vector1 + vector2
vector3.x // 3.0
vector3.y // 3.0
case class Vec(x: Double, y: Double):
def +(that: Vec) = Vec(this.x + that.x, this.y + that.y)
val vector1 = Vec(1.0, 1.0)
val vector2 = Vec(2.0, 2.0)
val vector3 = vector1 + vector2
vector3.x // 3.0
vector3.y // 3.0
У класса Vec есть метод +
, который мы использовали для добавления vector1
и vector2
. Используя круглые скобки, можно строить сложные выражения с читаемым синтаксисом. Пример создания класса MyBool
, которое включает в себя методы and
и or
case class MyBool(x: Boolean) {
def and(that: MyBool): MyBool = if (x) that else this
def or(that: MyBool): MyBool = if (x) this else that
def negate: MyBool = MyBool(!x)
}
case class MyBool(x: Boolean):
def and(that: MyBool): MyBool = if x then that else this
def or(that: MyBool): MyBool = if x then this else that
def negate: MyBool = MyBool(!x)
Теперь можно использовать операторы and
и or
в качестве инфиксных операторов:
def not(x: MyBool) = x.negate
def xor(x: MyBool, y: MyBool) = (x or y) and not(x and y)
Это помогает сделать объявление xor
более читабельным.
Порядок очередности
Когда выражение использует несколько операторов, операторы оцениваются на основе приоритета первого символа. Таблица приоритетов символов:
(символы которых нет снизу)
* / %
+ -
:
= !
< >
&
^
|
(буквы, $, _)
Такой приоритет распространяется на любые функции, которые вы задаете. Например, следующее выражение:
a + b ^? c ?^ d less a ==> b | c
эквивалентно
((a + b) ^? (c ?^ d)) less ((a ==> b) | c)
?^
имеет высший приоритет, потому что начинается с символа ?
. Второй по старшинству приоритет имеет +
, за которым следуют ==>
, ^?
, |
, и less
.
Contributors to this page:
Contents
- Введение
- Основы
- Единобразие типов
- Классы
- Значения Параметров По умолчанию
- Именованные Аргументы
- Трейты
- Кортежи
- Композиция классов с трейтами
- Функции Высшего Порядка
- Вложенные Методы
- Множественные списки параметров (Каррирование)
- Классы Образцы
- Сопоставление с примером
- Объекты Одиночки
- Регулярные Выражения
- Объект Экстрактор
- Сложные for-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Контекстные параметры, также известные, как неявные параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета