Tour of Scala

Операторы

Language

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

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: