web-dev-qa-db-fra.com

&& et || à Scala

depuis les opérateurs normaux comme +, ::, -> et ainsi de suite sont toutes les méthodes qui peuvent être surchargées et des trucs que je me demandais si || et && sont également des méthodes. Ceci pourrait théoriquement fonctionner s'il s'agissait de méthodes de l'objet booléen. Mais si elles le sont, pourquoi

if (foo == bar && buz == fol)

possible? Si le compilateur lit de droite à gauche, ceci invoquera && on bar au lieu de (foo == bar)

19
mice

6.12.3 Opérations infixes Un opérateur infixe peut être un identifiant arbitraire . Les opérateurs d'infixe ont une priorité et une associativité définies comme suit:

La priorité d’un opérateur infixe Est déterminée par le premier caractère de l’opérateur . Les caractères Sont énumérés ci-dessous par ordre croissant De priorité, les caractères de la même ligne ayant la même priorité.

  • (toutes les lettres)
  • |
  • ^
  • Et
  • <>
  • =!
  • :
  • + -
  • * /%
  • (tous les autres caractères spéciaux)

C’est-à-dire que les opérateurs commençant par une lettre Ont la priorité la plus basse, , Suivis des opérateurs commençant par ‘| ', Etc. 

Il existe une exception à Cette règle, qui concerne les opérateurs d’affectation (§6.12.4). La priorité de D'un opérateur d'assignation est identique à celle de Celle d'affectation simple (=). Ce Est inférieur à la priorité de De tout autre opérateur.

Il en découle une explication de l'associativité et de la manière dont tout cela est combiné dans une expression avec plusieurs opérateurs. Le Scala Reference est une bonne lecture.

30
Daniel C. Sobral

Parce que la méthode commence par = a une priorité plus élevée que la méthode commence par & .

Ainsi (foo == bar && buz == fol) deviendra quelque chose comme ce qui suit:

val tmp1: Boolean = (foo == bar)
val tmp2: Boolean = (buz  == fol)

tmp1 && tmp2
22
Brian Hsu

Ces deux méthodes sont définitivement en scala.

0
lasantha