Приоритет оператора в Scala - PullRequest
46 голосов
/ 27 мая 2010

Мне нравится предложение Scala о приоритете операторов, но в некоторых редких случаях неизмененные правила могут быть неудобными, поскольку у вас есть ограничения в именовании ваших методов. Существуют ли способы определения других правил для класса / файла и т. Д. В Scala? Если нет, то будет ли это решено в будущем?

Ответы [ 4 ]

100 голосов
/ 27 мая 2010

Приоритет оператора фиксируется в справочнике Scala - 6.12.3 Операции с инфиксами первым символом в операторе Перечислено в порядке возрастания приоритета:

(all letters)
|
^
&
= !
< >
:
+ -
* / %
(all other special characters)

И не очень вероятно, что это изменится. Это, вероятно, создаст больше проблем, чем исправит. Если вы используете обычный приоритет оператора, его изменение для одного класса будет весьма запутанным.

8 голосов
/ 27 мая 2010

Есть ли способы определить другие правила для класса / файла и т. Д. В Scala? Если нет, то будет ли это решено в будущем?

Такой способности нет, и вероятность того, что она будет добавлена ​​в обозримом будущем, мала.

2 голосов
/ 23 сентября 2017

Был запрос функции , поднятый в typelevel fork компилятора scala , версии компилятора, который «просматривает» экспериментальные функции. Разработчики предположили, что если кто-то и напишет для этого SIP , это может быть рассмотрено для реализации.

Но в его текущем состоянии нет способа переопределить приоритет. Его правила формально определены в спецификации языка .

0 голосов
/ 12 декабря 2016

неизмененные правила могут быть неудобны, потому что у вас есть ограничения в именовании ваших методов

  • у вас нет никаких ограничений в именовании ваших методов. Например, вы можете определить методы +, -, * и т. Д. Для класса.
  • мы также должны де-факто следовать «неизмененным правилам» (применяемым правилами приоритетов операторов Scala), упомянутым в предыдущем ответе (https://stackoverflow.com/a/2922456) Томасом Юнгом - это характерно для многих, если не для всех языков программирования, и абстрактно алгебра; нам не нужно переопределять приоритет оператора для a + b * c.

См. Главу 6 книги http://www.scala -lang.org / document / files / ScalaByExample.pdf для примера класса "Rational".

...