2012-03-16 20 views
77

¿Cuál es la convención de nomenclatura para las constantes de Scala? Una breve búsqueda sobre las sugerencias de StackOverflow Mayúsculas CamelCase (la primera línea a continuación), pero quería verificar dos veces.Convención de nomenclatura para las constantes de Scala?

val ThisIsAConstant = 1.23 
val THIS_IS_ANOTHER_CONSTANT = 1.55 
val thisIsAThirdConstant = 1.94 

¿Qué se recomienda? ¿Estilo de Scala?

+2

Cuando es para ser utilizado como un, C-/constante de estilo Java convencional completamente-predefinido, la primera. La segunda forma (y los subrayados en los nombres en general) nunca se usa realmente. El tercero generalmente se usa para valores inmutables que se generan dinámicamente. – Destin

+3

Estoy usando el segundo, pero sobre todo a la experiencia anterior de Java. Ignore eso, creo que la manera más oficial es la primera (ya que se usa en la propia escala de escalas, por ejemplo, mire π que se define como 'Pi '). –

Respuesta

108

El estilo oficialmente recomendado (y me refiero oficialmente) es el primer estilo, la caja de camello con la primera letra es mayúscula. Está claramente establecido por Odersky en Programming in Scala.

El estilo también es seguido por la biblioteca estándar, y tiene cierto apoyo en la semántica del lenguaje: los identificadores que comienzan con mayúsculas se tratan como constantes en la coincidencia de patrones.

(Sección 6.10, pág. 107 en la segunda edición)

+1

En cuanto a las pautas oficiales de nombres de Scala, la variante 3 es de hecho el estilo recomendado: http://docs.scala-lang.org/style/naming-conventions.html # values_variable_and_methods – Matthias

+3

@Matthias Eso no cubre las constantes. Un descuido terrible, pero créeme, no solo eso no es correcto, sino que el tercer estilo causará problemas, tan pronto como lo uses en una coincidencia de patrón. –

+1

@Matthias He abierto [un problema] (https://github.com/scala/scala.github.com/issues/231) al respecto. Normalmente haría la corrección y la publicidad, pero lamentablemente estoy perdiendo el tiempo en estos días. :( –

38

(Este es un comentario anexo a la respuesta de Daniel, pero la he publicado como una respuesta para el beneficio de resaltado de sintaxis y el formato.)

El punto de Daniel sobre el estilo de utilizar una letra mayúscula inicial que es importante en la semántica del lenguaje es más sutil e importante de lo que originalmente le atribuí cuando aprendí Scala.

Considere el siguiente código:

object Case { 
    val lowerConst = "lower" 
    val UpperConst = "UPPER" 

    def main(args: Array[String]) { 
    for (i <- Seq(lowerConst, UpperConst, "should mismatch.").map(Option.apply)) { 
     print("Input '%s' results in: ".format(i)) 
     i match { 
     case Some(UpperConst) => println("UPPER!!!") 
     case Some(lowerConst) => println("lower!") 
     case _ => println("mismatch!") 
     } 
    } 
    } 
} 

Ingenuamente lo que habría esperado que para llegar a todos los casos en el partido. En su lugar se imprime:

Input 'Some(lower)' results in: lower! 
Input 'Some(UPPER)' results in: UPPER!!! 
Input 'Some(should mismatch.)' results in: lower! 

Lo que está pasando es que las sombras case Some(lowerConst) Val lowerConst y crea una variable local con el mismo nombre que se rellenará cualquier momento se evalúa un Some que contiene una cadena.

Existen formas de evitarlo, pero lo más simple es seguir la guía de estilo para nombres constantes.

Si no puede seguir la convención de nombres, entonces como @reggoodwin señala en los comentarios a continuación, usted puede poner el nombre de la variable en las garrapatas, al igual que

case Some(`lowerConst`) => println("lower!") 
+1

Añadiendo a la respuesta de Leif: este escenario se menciona en Programación en Scala 15.2. Si no hay más remedio que utilizar una constante que comience con una minúscula, se puede escapar con marcas de retroceso, p. case \ 'pi \' => .... – reggoodwin

+1

if case Algunas (lowerConst) sombrean valconConst, ¿por qué no es caso Some (UpperConst) sombreando el val UpperConst? – Adrian

+0

@Leif Wickland @Daniel C. Sobral ¿El valor de las constantes importa por el bien de la convención de coincidencia de patrones? p.ej. 'val UpperConst =" UPPER_CONST "' correcto o debe ser 'val UpperConst =" UpperConst "' – nir

5

Los nombres de constantes deben estar en caja de camello superior. Es decir, si el miembro es final, inmutable y pertenece a un objeto de paquete o un objeto, puede considerarse una constante .... Método, Valor y nombres de las variables deben estar en minúsculas camello

http://docs.scala-lang.org/style/naming-conventions.html#constants-values-variable-and-methods

+0

¿Importa el valor de las constantes en aras de la convención de la coincidencia de patrones? p.ej. val 'UpperConst =" UPPER_CONST "' como parte del estilo java ok o debería ser 'val UpperConst =" UpperConst "' – nir

Cuestiones relacionadas