2012-03-16 78 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