2010-06-22 6 views

Respuesta

17

No estoy seguro de cuál es la convención para usar _! y _!! en Lift, pero aquí hay un poco de historia.

Cualquier identificador alfanumérico puede tener _y una lista de símbolos agregados y todavía se analiza como un identificador único. Por ejemplo:.

scala> class [email protected]%*! 
defined class Example_$bang$at$percent$times$bang 

(De hecho, puede analizar casi cualquier cosa como un identificador si se rodea con acentos abiertos - y esto es lo que haces si una clase Java utiliza una palabra reservada de Scala, por ejemplo O si quiere espacios en sus identificadores).

El compilador solo reconoce una terminación simbólica especialmente, sin embargo. Si hay un método que se parece a un getter, entonces getter_ = se interpretará como un setter. (Ya sea que en realidad uso como un regulador depende de usted;. Contará con la semántica de un organismo, de todos modos) Así

scala> class Q { def q = "Hi"; def q_=(s: String) { println(s.reverse) } } 
defined class Q 

scala> val q = new Q 
q: Q = [email protected] 

scala> q.q 
res0: java.lang.String = Hi 

scala> q.q = "Could use this to set something" 
gnihtemos tes ot siht esu dluoC 

Además, el compilador se invierte el orden de los comunicantes se envían en cualquier método que termine en :. Esto se ve más a menudo en las listas: newElement :: existingList es en realidad una llamada al existingList.::(newElement). Así, por ejemplo:

scala> object Caps { def to_:(s: String) = s.toUpperCase } 
defined module Caps 

scala> "Example" to_: Caps 
res40: java.lang.String = EXAMPLE 

ningún otro uso del _ + símbolos es convención.

+0

Wow. Gran conferencia No sabía casi nada de esto. ¡Gracias! – aioobe

+3

'_' se usa para separar grupos de caracteres de palabras de caracteres de símbolos. Entonces 'foo _ !! _ bar' es un identificador legal. Si no quiere seguir esta regla, o necesita usar una palabra reservada, también puede incluirla en los backticks. Esto es útil para llamar a los métodos de Java llamados 'tipo', por ejemplo. – retronym

+2

@retronym - Buen punto sobre los palos de retroceso; Añadiré eso. Sin embargo, intente escribir 'val foo _ !! _ bar = 0' en el REPL ... –

8

¡No hay significados especiales para el! en los nombres de Scala. En la familia de lenguajes basados ​​en Lisp,! a menudo se usa para indicar que una función tiene efectos secundarios, y esa parece ser la convención aquí.

+2

Otra convención similar es usar para usar listas de cero parámetros para funciones libres de efectos secundarios, y una lista de parámetros vacía para otras. p.ej. 'gun.model' vs' gun.fire() ' – retronym

+2

Ruby usa'! 'para * efectos secundarios * también – OscarRyz

6

Extrañamente no mencionado hasta el momento (aunque no particularmente relevante para su pregunta) es unary_! que es tratado especialmente.

scala> class A { def unary_! = 5 } 
defined class A 

scala> !(new A) 
res0: Int = 5 
+2

Tiene más que ver con unary_ luego! al final. Puede tener unary_ + por ejemplo –

Cuestiones relacionadas