web-dev-qa-db-ja.com

Scala定数?

Scala定数?.

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

推奨されるScalaスタイル?

91
grautur

公式に推奨されるスタイル(および公式に意味する)は最初のスタイルで、最初の文字が付いたラクダケースは大文字です。 OderskyがScalaのプログラミングについて明確に定めています。

スタイルの後には標準ライブラリも続き、言語セマンティクスでいくつかのサポートがあります。大文字で始まる識別子は、パターンマッチングで定数として扱われます。

(第2版のセクション6.10、p。107)

120

(これはダニエルの答えに対する補遺のコメントですが、構文の強調表示と書式設定の利点のために答えとして投稿しています。)

言語のセマンティクスで重要である最初の大文字を使用するスタイルに関するダニエルのポイントは、私が最初に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!")
_
41
Leif Wickland

定数名は大文字のキャメルケースにする必要があります。つまり、メンバーが最終的で不変であり、それがパッケージオブジェクトまたはオブジェクトに属する場合、定数と見なされます....メソッド、値と変数名は小文字のキャメルケースである必要があります

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

7
samthebest