Scala常数的命名约定?


97

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

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

推荐哪种Scala样式?


2
当要像常规的完全预定义的C // Java样式常量一样使用它时,第一个。第二种形式(通常在名称中带有下划线)从未真正使用过。第三种通常用于动态生成的不可变值。
德斯汀2012年

3
我使用的是第二篇,但主要是基于先前的Java经验。不用理会,我认为最正式的方法是第一种(因为它是在scala lib本身中使用的,例如,查看π,它定义为Pi)。
om-nom-nom 2012年

Answers:


127

官方推荐的样式(我的意思是正式的)是第一种样式,驼峰式大写字母大写。它由Odersky在Scala编程中明确规定。

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

(第二版第6.10节第107页)


1
查看官方的Scala命名准则,实际上建议使用变体3:docs.scala-lang.org/style/…–
Matthias

4
@Matthias不覆盖常量。但是,请相信我,这是一个糟糕的疏忽,不仅不正确,而且一旦将其用于模式匹配,第三种样式也会引起问题
Daniel C. Sobral

1
@Matthias我现在打开了一个有关它的问题。我通常会进行修复和PR,但可悲的是,这些天我没有时间。:(
Daniel C. Sobral

1
@samthebest废话。它在特征方面非常有意义,即使在功能范围内,如果您打算在模式匹配中使用它,也很有意义。
Daniel C. Sobral

1
我一直在使用scalastyle来检查代码中的样式冲突。但这似乎并没有抓住常量的这些命名约定错误。有没有一种方法可以启用检查,以确保在驼峰式的情况下以首字母大写的形式命名常量?
jithinpt

43

(这是丹尼尔答案的附录注释,但我将其发布为答案,以突出显示语法和设置格式。)

丹尼尔(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)val 的阴影处lowerConst创建了一个同名的局部变量,该变量将在每次Some评估包含字符串的变量时填充。

公认有解决方法,但最简单的方法是遵循样式指南进行连续命名。

如果您不能遵循命名约定,那么正如@reggoodwin在下面的注释中指出的那样,您可以将变量名放在刻度中,如下所示

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

1
添加到Leif的答案中:Scala 15.2中的编程中提到了这种情况。如果别无选择,只能使用以小写字母开头的常量,则可以使用反引号将其转义,例如case'pi` => ....
reggoodwin,2013年

1
如果case Some(lowerConst)遮盖了val LowerConst,为什么case Some(UpperConst)遮盖了val UpperConst?
阿德里安

@Leif Wickland @Daniel C. Sobral常量值是否出于模式匹配的惯例而重要?例如,val UpperConst = "UPPER_CONST"可以,或者应该是val UpperConst = "UpperConst"
nir

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.