2010-12-04 35 views
13

Je commence à lire le code source de l'ascenseur ascenseur, je trouve qu'il ya tellement de méthodes sont définies en utilisant un nom comme methodName_?, est-il une convention que _? a une signification particulière?Pourquoi les gens utilisent _? comme un suffixe d'identifiant?

def empty_? : Boolean = {} 
+0

Question similaire: http://stackoverflow.com/questions/1598410/use-of-special-characters-in-function-names – aioobe

Répondre

24

Le ? indique que c'est un prédicat, une fonction renvoyant Boolean. Cette convention remonte à Lisp, où ? (Scheme), p ou -p (d'autres Lisps, simulant le point d'interrogation avec une lettre "similaire") indiquent également des prédicats. Pensez-y comme posant une question, "l'objet est-il vide?" Scala autorisera uniquement les noms d'identifiants mixtes (contenant des caractères alphanumériques et des signes de ponctuation) si vous les séparez par _. Par exemple,

scala> def iszero?(x : Int) = x == 0 
<console>:1: error: '=' expected but identifier found. 
     def iszero?(x : Int) = x == 0 
       ^

ne fonctionne pas, mais

scala> def iszero_?(x : Int) = x == 0   
iszero_$qmark: (x: Int)Boolean 

fait.

+1

Lisez la question trop rapidement. J'ai supprimé le mien et voté celui-ci. – duffymo

26

Vous ne verrez probablement pas la construction à l'extérieur de l'ossature de l'ascenseur; Je soupçonne que c'est surtout Ruby-Envy.

Presque tous les autres projets Scala se déroberont à cette syntaxe. Pas à cause du point d'interrogation final, mais parce que c'est encore une autre façon d'introduire des underscores dans votre code - et le symbole est déjà trop surchargé.

Basé sur une évaluation de plusieurs projets Scala, la notation peut être raisonnablement décrite comme non-idiomatique.

MISE À JOUR

La raison pour laquelle le trait de soulignement est nécessaire est de lever l'ambiguïté de la notation infixe, dans laquelle:

x?y 

serait lu comme

x.?(y) 

avec ? étant nom de la méthode. Attendu que:

x_?y 

Il est clair que x_? comme démarque étant atomique.

La syntaxe est un exemple de ce qui est officiellement connu comme un « identifiant mixte », et vise à permettre aux définitions telles que

def prop_=(v:String) = ... //setter 
def unary_- = ... //prefix negation operator 

Il pourrait (sans doute) être considéré comme un hack lorsque construction similaire est utilisé Il suffit de placer un point d'interrogation à la fin du nom d'une méthode.

+3

"Le symbole est déjà trop surchargé" En tant que jeton séparé, bien sûr, mais pas à l'intérieur des identifiants. –

+3

@Alexey Romanov: Pourtant, cela va à l'encontre de la convention Scala d'utiliser CamelCase et dromedaryCase dans les identifiants. –

+0

Oui, trop de caractères de soulignement dans le code source de Scala.Dans Lift, il y a des underscores partout comme: ParsePath (List ("account", acctName), _, _, _), _, _), vous devez écrire des tonnes de ParsePath comme ceci. – Sawyer