В Скале операторы - это обычные методы. В качестве инфиксного оператора может быть использован любой метод с одним параметром. Например, + может вызываться с использованием точки:
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.