web-dev-qa-db-fra.com

Priorité des opérateurs dans Scala

J'aime la proposition de priorité d'opérateur de Scala, mais dans de rares cas, les règles non modifiées peuvent être gênantes, car vous avez des restrictions pour nommer vos méthodes. Existe-t-il des moyens de définir d'autres règles pour une classe/un fichier, etc. dans Scala? Sinon, serait-il résolu à l'avenir?

48
Jeriho

La priorité de l'opérateur est fixée dans Référence Scala - 6.12.3 Opérations d'infixe par le premier caractère de l'opérateur. Listés par ordre de priorité croissant:

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

Et il est peu probable que cela change. Cela créera probablement plus de problèmes qu'il n'en résout. Si vous utilisez la priorité d'opérateur normale, la changer pour une classe sera assez déroutant.

100
Thomas Jung

Existe-t-il des moyens de définir d'autres règles pour une classe/un fichier, etc. dans Scala? Sinon, serait-il résolu à l'avenir?

Cette capacité n'existe pas et il est peu probable qu'elle soit ajoutée dans un avenir prévisible.

8
Randall Schulz

Il y avait un demande de fonctionnalité levé dans le fourchette de type du compilateur scala , une version du compilateur qui 'prévisualise' les fonctionnalités expérimentales. Les développeurs ont suggéré que si quelqu'un écrivait un SIP pour cela, il pourrait être envisagé pour l'implémentation.

Mais dans son état actuel, il n'y a aucun moyen de remplacer la priorité. Ses règles sont formellement définies dans le spécification du langage .

2
Luciano

les règles non modifiées peuvent être gênantes, car vous avez des restrictions pour nommer vos méthodes

  • vous n'avez aucune restriction pour nommer vos méthodes. Par exemple, vous pouvez définir des méthodes +, -, * et etc. pour une classe.
  • nous devons également suivre de facto les "règles non modifiées" (appliquées par Scala) mentionnées dans la réponse précédente ( https://stackoverflow.com/a/2922456 =) par Thomas Jung - il est commun pour de nombreux sinon tous les langages de programmation et l'algèbre abstraite; nous n'avons pas besoin de redéfinir la priorité des opérateurs pour a + b * c.

Voir le chapitre 6 du livre http://www.scala-lang.org/docu/files/ScalaByExample.pdf pour l'exemple de classe "Rational".

0
Fuad Efendi