Scala常量的命名规范是什么?

108

Scala常量的命名规范是什么?对此进行了简短的StackOverflow搜索,建议使用大写的驼峰命名法(下面的第一行),但我想再次确认。

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

哪种Scala风格被推荐?


2
当需要像传统的、完全预定义的C/Java风格常量一样使用时,使用第一种形式。第二种形式——以及名称中的下划线通常不会被使用。第三种形式通常用于动态生成的不可变值。 - Destin
3
我正在使用第二个选项,但主要是因为我有Java的经验。请忽略这一点,我认为官方方式大多数情况下应该采用第一个(因为它在Scala库中被使用,例如看一下定义为“Pi”的π)。 - om-nom-nom
3个回答

140

官方推荐的风格(我指的是官方)是第一种风格,驼峰式命名,首字母大写。这在《Scala编程》一书中由Odersky明确规定。

该风格也被标准库遵循,并且在语言语义上得到了一些支持:以大写字母开头的标识符在模式匹配中被视为常量。

(第二版107页第6.10节)


1
查看官方Scala命名指南,实际上推荐使用变体3的风格:http://docs.scala-lang.org/style/naming-conventions.html#values_variable_and_methods - mxk
5
@Matthias 这并没有涵盖常量。这是一个可怕的疏忽,但是相信我,不仅如此是不正确的,而且第三种风格会在你在模式匹配中使用它时带来问题。 - Daniel C. Sobral
1
@Matthias 我现在已经开了一个问题(https://github.com/scala/scala.github.com/issues/231)关于这个问题。通常我会修复并提交PR,但是我最近时间不够了。 :( - Daniel C. Sobral
1
@samthebest 无稽之谈。在特征方面它是完全有意义的,即使在函数范围内,如果你要在模式匹配中使用它,它也是有意义的。 - Daniel C. Sobral
1
我一直在使用scalastyle来检查代码中的样式违规。但它似乎无法捕捉到常量命名约定错误。有没有一种方法可以启用检查,确保常量以大写字母开头的驼峰命名法命名? - jithinpt
显示剩余9条评论

47

(这是一个对Daniel答案的补充评论,但我会将其发布为答案,以便获得语法高亮和格式化的好处。)

Daniel关于使用首字母大写的风格在语言语义上的重要性比我学习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) 遮蔽了变量 lowerConst 并创建了一个同名的本地变量,每当评估包含字符串的 Some 时都会填充该变量。
诚然有一些方法可以解决这个问题,但最简单的方法是遵循常量命名的风格指南。
如果无法遵循命名约定,则可以像 @reggoodwin 在下面的评论中指出的那样,将变量名称放在引号中。
case Some(`lowerConst`) => println("lower!")

1
补充Leif的答案:这种情况在《Scala编程》15.2中有提到。如果没有选择,只能使用以小写字母开头的常量,则可以用反引号进行转义,例如:case `pi` => ...。 - reggoodwin
3
如果 case Some(lowerConst) 遮蔽了 val lowerConst,为什么 case Some(UpperConst) 没有遮蔽 val UpperConst? - Adrian
@Leif Wickland @Daniel C. Sobral 常量的值对于模式匹配的约定有影响吗?例如,val UpperConst = "UPPER_CONST"可以吗?还是应该写成val UpperConst = "UpperConst" - nir

9

常量的值对于模式匹配的惯例很重要吗?例如,像part java-style好还是应该是'val UpperConst = "UpperConst"'? - nir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接