Question

Dans Scala, pourquoi puis-je omettre le point et les bretelles dans T m 0 (au lieu de T.m (0) ) dans ce qui suit?

scala> object T { def m(i:Int) = 0 == i }
defined module T

scala> T m 0
res19: Boolean = true

Mais pourquoi ne puis-je pas omettre les brakets dans n (0) dans ce qui suit?

scala> def n(i:Int) = 0 == i
n: (Int)Boolean

scala> n 0
<console>:1: error: ';' expected but integer literal found.
       n 0
         ^
Était-ce utile?

La solution

Le premier exemple, T m 0, est un exemple de "notation opérateur". Scala a trois types de notations d'opérateur, prefix (appelé unary), infix et postfix. Voyons des exemples des trois en action ici:

class MyByte(val n : Int) {
  require(n >= 0 && n <= 255)
  def unary_! = new MyByte(n ^ 0xff)
  def +(m : MyByte) = new MyByte(n + m.n)
  def bits = (math.log(n) / math.log(2) + 1).toInt
  override def toString = "0" * (8 - bits) + n.toBinaryString
}

Un ici il est utilisé:

scala> val a = new MyByte(5)
a: MyByte = 00000101

scala> val b = new MyByte(10)
b: MyByte = 00001010

scala> ! a  // Prefix/Unary
res58: MyByte = 11111010

scala> a + b  // Infix
res59: MyByte = 00001111

scala> b bits  // Postfix
res60: Int = 4

Bien que les notations infixes et postfixes acceptent tout identifiant Scala valide, bien que l'on parle de restreindre la notation postfixe, seuls quatre identificateurs peuvent être utilisés comme préfixe: ~,!, - et +.

Maintenant, lorsque vous essayez "m 0", Scala le supprime en tant qu'opérateur unaire, au motif qu'il n'est pas valide (~,!, - et +). Il constate que " m " est un objet valide - c'est une fonction, pas une méthode, et toutes les fonctions sont des objets.

As " 0 " n'est pas un identifiant Scala valide, il ne peut s'agir ni d'un infixe ni d'un opérateur postfix. Par conséquent, Scala se plaint de s’attendre à ce que " ;; " - qui séparerait deux expressions (presque) valides: " m " et "0". Si vous l'insériez, alors il se plaindra que m nécessite soit un argument, soit, à défaut, un "_". en faire une fonction partiellement appliquée.

Autres conseils

Je pense que le style de syntaxe d'opérateur ne fonctionne que lorsque vous avez un objet explicite à gauche. La syntaxe est destinée à vous permettre d’exprimer "Opérateur Opérande Opérande". opérations de style de manière naturelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top