2010-12-04 7 views
13

Ich beginne lesen Lift-Framework Quellcode, finde ich, dass es so viele Methoden sind mit einem Namen wie methodName_? definiert, gibt es eine Konvention, die _? hat eine besondere Bedeutung?Warum benutzen Leute _? als Bezeichner Suffix?

def empty_? : Boolean = {} 
+0

Ähnliche Fragen: http://stackoverflow.com/questions/1598410/use-of-special-characters-in-function-names – aioobe

Antwort

24

Die ? zeigt, dass dies ein Prädikat ist, eine Funktion der Rückkehr Boolean. Diese Konvention geht auf Lisp zurück, wobei ? (Schema), p oder -p (andere Lisps, die das Fragezeichen mit einem "ähnlichen" Buchstaben simulieren) auch Prädikate bezeichnen. Stellen Sie sich eine Frage vor: "Ist das Objekt leer?"

Scala erlaubt nur gemischte Bezeichner (mit alphanumerischen Zeichen und Interpunktion), wenn Sie sie durch _ trennen. Z. B.

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

nicht funktioniert, aber

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

tut.

+1

Lesen Sie die Frage zu schnell. Ich habe meine gelöscht und diese gewählt. – duffymo

26

Es ist unwahrscheinlich, dass Sie das Konstrukt außerhalb des Aufzugsrahmens sehen. Ich vermute, dass es meistens Ruby-Neid ist.

Fast jedes andere Scala-Projekt wird sich vor dieser Syntax scheuen. Nicht wegen des abschließenden Fragezeichens, sondern weil es eine weitere Möglichkeit ist, Unterstriche in Ihren Code einzufügen - und das Symbol ist bereits viel zu stark überladen.

Basierend auf einer Auswertung mehrerer Scala-Projekte kann die Notation als nicht idiomatisch beschrieben werden.

UPDATE

Der Grund, dass der Unterstrich erforderlich ist, ist von der Infix-Schreibweise eindeutig zu machen, in denen:

x?y 

würde

x.?(y) 

mit ? A als

gelesen werden, dass Methodenname. Während:

x_?y 

demarks Klar x_? als Atom zu sein.

Die Syntax ist ein Beispiel dessen, was formal als „mixed identifier“ bekannt ist, und soll Definitionen ermöglichen, wie beispielsweise

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

Es könnte (wohl) einen Hack berücksichtigt werden, wenn ähnliches Konstrukt verwendet wird, Einfach ein Fragezeichen an das Ende eines Methodennamens schieben.

+3

"Das Symbol ist bereits viel zu stark überlastet" Als separates Token, sicher, aber nicht innerhalb von Identifiern. –

+3

@Alexey Romanov: Dies ist immer noch gegen die Scala-Konvention der Verwendung von CamelCase und dromedaryCase in Identifikatoren. –

+0

Ja, zu viele Unterstriche im Scala-Quellcode.In Lift gibt es überall Unterstriche wie: ParsePath (Liste ("account", acctName), _, _, _), _, _), so muss man Tonnen von ParsePath schreiben. – Sawyer