В Скале операторы - это обычные методы. В качестве инфиксного оператора может быть использован любой метод с одним параметром. Например, + может вызываться с использованием точки:
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-выражения
 - Обобщенные Классы
 - Вариантность
 - Верхнее Ограничение Типа
 - Нижнее Ограничение Типа
 - Внутренние классы
 - Члены Абстрактного Типа
 - Составные Типы
 - Самоописываемые типы
 - Контекстные параметры, также известные, как неявные параметры
 - Неявные Преобразования
 - Полиморфные методы
 - Выведение Типа
 - Операторы
 - Вызов по имени
 - Аннотации
 - Пакеты и Импорт
 - Объекты Пакета