Skip to content

OverloadedOperators (ru)

Dima Kruk edited this page Feb 7, 2013 · 3 revisions

OverloadedOperators - языковое расширение, добавляющее возможность перегрузки операторов.

Перегрузка оператора имеет два основных преимущества:

  1. Компактный синтаксис и читабельность. Например, намного удобнее использовать a*b*c вместо a.multiply(b).multiply(с).
  2. Более естественный вид кода. Удачно определённый оператор легче понять и запомнить, чем имя метода. Например, сложение двух переменных типа Point может выглядеть, как point1 + point2, вместо point1.plus(point2). point1.plus(point2).

##Декларация

Для использования OverloadedOperators вам необходимо импортировать язык overloadedOperators. После этого в контекстном меню пакета появится пункт "New->OverloadedOperatorsContainer".

overloaded operators declarationName { 

  <<overloaded binary operators>> 
  <<custom operators declaration>> 

}
operator operatorAlias ( leftPartType, rightPartType ) -> operatorType
commutative : Boolean
( left, right ) -> returnType {
  return result
}

Блок декларации перегруженного оператора служит для описания поведения оператора.

overloaded operators MyOperators {

  // перегруженный оператор "+" для типа Point
  operator + (Point, Point) -> Point 
  commutative: false
  (left, right)->Point {
    // будет вызвано при сложении Point и Point
    return new Point(left.x + right.x, left.y + right.y); 
  }
}

###custom operators operatorAlias

Добавляет пользовательское визуальное представление оператора. После полного описания, оператор будет доступен в коде при автозаполнении.

В примере показано, как создать пользовательский оператор, который будет проверять строку на соответствие регулярному выражению.

overloaded operators MyOperators { 

// overloaded operators ------------------------- / 

operator ~= (String, RegExp) -> Boolean 
commutative: true 
(left, right)->Boolean { 
  return right.test(left); 
} 

// custom operators ----------------------------- / 

custom operator ~= 

} 
public function method()
{
  if ("Any text" ~= /^Any.+$/) { 
    // if true, output this message 
    trace "text start with 'Any'";
  }
} 

Коммутативность

commutative : Boolean

Переключатель правила коммутативности, который определяет поведение перегруженного оператора. Значение по умолчанию false. Изменяйте это поведение с осторожностью. Изменение поведения может приводить к неожиданным эффектам.

Clone this wiki locally