2012-03-16 57 views
77

Scala常量的命名约定是什么?一个简单的搜索StackOverflow建议大写CamelCase(下面的第一行),但我想仔细检查。Scala常量的命名约定?

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

这是推荐的Scala风格?

+2

当它被使用像常规的完全预定义的C-/Java风格常数,第一个。第二种形式 - 通常在名称中强调 - 从未真正使用过。第三个通常用于动态生成的不可变值。 – Destin 2012-03-16 23:11:00

+3

我正在使用第二个,但主要是以前的Java体验。无视这一点,我认为大多数官方方式是第一种(因为它在scala lib本身中使用,例如看π,定义为Pi)。 – 2012-03-16 23:16:54

回答

108

正式推荐的风格(我的意思是正式的)是第一种风格,第一个字母的骆驼案例是大写。它由Odersky在Scala编程中明确规定。

样式也跟着标准库,并且在语言语义上有一些支持:以大写​​开头的标识符在模式匹配中被视为常量。

(第6.10节,第107页第二版)

+1

看看官方的Scala命名指南,变体3实际上是推荐的风格:http://docs.scala-lang.org/style/naming-conventions。html#values_variable_and_methods – Matthias 2013-08-09 08:28:24

+3

@Matthias不包含常量。一个可怕的疏忽,但是,相信我,这不仅是不正确的,但是第三种方式会导致问题,只要你在模式匹配上使用它。 – 2013-08-09 18:07:49

+1

@Matthias我现在已经打开[一个问题](https://github.com/scala/scala.github.com/issues/231)。我通常会做的修复和公关,但我很遗憾现在缺乏时间。 :( – 2013-08-09 18:16:50

38

(这是丹尼尔的回答增编的评论,但我张贴它作为语法高亮和格式的好处的答案。)

丹尼尔关于使用首字母大写字母在语言语义中很重要的方式的观点比我最初在学习Scala时给出的功劳更加微妙和重要。

考虑下面的代码:

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!") 
     } 
    } 
    } 
} 

天真我本来期望,要达到所有的情况下将比分扳平。相反,它打印:

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

这是怎么回事的是,case Some(lowerConst)阴影VAL lowerConst,并且创建将被填充包含字符串Some评估任何时间相同名称的局部变量。

确实有办法解决它,但最简单的方法是按照风格指南进行恒定命名。

如果不能遵守命名约定,那么作为@reggoodwin在下面的评论中指出的,你可以把变量名蜱,像这样

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

添加到Leif的答案:在Scala 15.2编程中提到了这种情况。如果别无选择,只能使用以小写开始的常量,那么它可以通过反标来逃脱,例如, case \'pi \'=> .... – reggoodwin 2013-05-26 17:42:19

+1

if case Some(lowerConst)阴影val lowerConst,为什么不是 case Some(UpperConst)阴影val UpperConst? – Adrian 2016-04-11 18:44:39

+0

@Leif Wickland @Daniel C. Sobral为了模式匹配的惯例,常量的值是否重要?例如'val UpperConst =“UPPER_CONST”'好的,或者应该是'val UpperConst =“UpperConst”' – nir 2016-08-15 22:47:33

5

常量名应该是上骆驼案件。也就是说,如果该构件是 最后,不可变的,它属于一个包对象,或者它可以被认为是一个对象, 恒定....方法,价值和变量名称应在下骆驼壳体

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

+0

为了模式匹配的惯例,常量的值是否重要?例如val'UpperConst =“UPPER_CONST”'就像java风格的部分没关系,或者它应该是'val UpperConst =“UpperConst”' – nir 2016-08-15 22:49:13