5.3 Перегрузка и пользовательские операторы
Перегрузка встроенных операторов — объявления op в impl:
impl Vec3 {
static op +(a: Vec3, b: Vec3) -> Vec3 => Vec3(a.x + b.x, a.y + b.y, a.z + b.z)
static op *(v: Vec3, k: f32) -> Vec3 => Vec3(v.x * k, v.y * k, v.z * k)
static op -(v: Vec3) -> Vec3 => v * -1.0
op [](i: usize) -> f32 { … } // чтение по индексу
var op [](i: usize) -> &var f32 { … } // запись по индексу
op ()(t: f32) -> Vec3 { … } // вызов как функции
static op <=>(a: Vec3, b: Vec3) -> Ordering { … }
op as Vec4 => Vec4(x, y, z, 1.0)
}- Перегружаемые: арифметические, побитовые, сравнения через
<=>,[],(),as, составные присваивания. - НЕ перегружаемые:
&& || ?? ?. ? ! is = -> ?-> ~> !> |> =>,.,... a op= bпо умолчанию означаетa = a op b; объявлениеvar op +=заменяет это поведение.==/!=берутся изEq;<,<=,>,>=— из<=>(Ord).- Неявных преобразований нет;
op as Tвызывается только явнымx as T.
Пользовательские операторы:
operator <|> <T>(a: Parser<T>, b: Parser<T>) -> Parser<T> infixl 3 => a.orElse(b)
operator ~~ (s: str, re: Regex) -> bool infix 4 => re.matches(s)
operator ^^ (a: f64, b: f64) -> f64 infixr 12 => a.pow(b)
operator ¬ (b: Bits) -> Bits prefix => b.invert()- Символ оператора — последовательность из
+ - * / % < > = ! & | ^ ~ ? .или символов Unicode категорий Sm/So. Последовательность НЕ ДОЛЖНА совпадать со встроенным оператором или разделителем и НЕ ДОЛЖНА начинаться с//или/*. - Фиксность:
infixl N,infixr N,infix N(N — уровень 1–12 из таблицы 5.2) илиprefix(уровень 14). Постфиксных пользовательских операторов нет. - Оператор — обычное объявление с видимостью; в другом модуле используется только после явного импорта (
use parsers { <|> }). - Любую функцию двух аргументов можно вызвать инфиксно:
a `max` b(уровень 4, без ассоциативности).
Связанные диагностики
not-callable, not-overloadable, operator-decl, range-not-iterable
См. также
Исходник: docs/spec/oxl-standard.md