Scala定数の命名規則?


97

Scala定数の命名規則は何ですか?StackOverflowの提案を簡単に検索して大文字のCamelCase(下の1行目)を検索しましたが、再確認したいと思いました。

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

推奨されるScalaスタイルはどれですか?


2
従来の完全に定義されたC / Javaスタイルの定数のように使用する場合は、最初の定数。2番目の形式(および名前のアンダースコア)は、実際には使用されません。3番目は通常、動的に生成される不変の値に使用されます。
デスティン2012年

3
私は2番目のものを使用していますが、ほとんどは以前のJavaの経験です。それを無視して、私は最も公式な方法が最初のものであると思います(それがscala lib自体で使用されているため、たとえばとして定義されているπを見てくださいPi)。
om-nom-nom 2012年

回答:


127

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

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

(第2版の6.10節、107ページ)


1
公式のScala命名ガイドラインを見ると、バリアント3は実際に推奨されるスタイルです。docs.scala
Matthias

4
@Matthiasそれは定数をカバーしません。ひどい見落としですが、信頼してください。それが正しくないだけでなく、パターンマッチで使用するとすぐに、3番目のスタイルで問題が発生します。
ダニエルC.ソブラル2013

1
@Matthias私は今それについて問題をオープンしました。私は通常、修正とPRを行いますが、最近は悲しいことに時間が足りません。:(
ダニエルC.ソブラル2013

1
@samthebestナンセンス。これは、特性上は完全に理にかなっており、機能の範囲でさえ、パターンマッチングで使用する場合には理にかなっています。
ダニエルC.ソブラル2013年

1
私は自分のコードのスタイル違反をチェックするためにscalastyleを使用しています。しかし、定数のこれらの命名規則エラーをキャッチしていないようです。定数がキャメルケースで最初の文字が大文字で命名されていることを確認するチェックを有効にする方法はありますか?
jithinpt 2016年

43

(これはダニエルの回答への補遺コメントですが、構文の強調表示とフォーマットの利点のための回答として投稿します。)

最初の大文字を言語セマンティクスで重要とするスタイルについてのダニエルのポイントは、私が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

1
ケースSome(lowerConst)が値lowerConstをシャドウしている場合、なぜケースSome(UpperConst)が値UpperConstをシャドウしないのですか?
エイドリアン

@Leif Wickland @Daniel C. Sobralパターンマッチングの慣例のために定数の値は重要ですか?たとえば、val UpperConst = "UPPER_CONST"大丈夫か、それはそうでなければなりませんval UpperConst = "UpperConst"
nir

7

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

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


定数の値は、パターンマッチングの規約のために重要ですか?たとえば、UpperConst = "UPPER_CONST"javaのようなvalのようなjava-styleは大丈夫か、そうでなければなりませんval UpperConst = "UpperConst"
nir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.