Scalaにおける変数

DataCampの新しく発売されたScalaコースをご確認ください:Scalaの入門

Scalaは、Apache Sparkを使用した大規模データ处理において、データ科学者では幅広く使用されています。それは、以下のような多くの基本的な機能を持った、オブジェクト指向と functional programming languageです。

  1. Scalaは、変数のデータ型は使用前に定義されることで、静的な型付けの言語です。型の確認はコンパイル時に行われ、実行時には行われません。
  2. また、”強い型付け”の言語であり、変数に対する操作の前に変数を確認することです。
  3. また、型推論をサポートしています。コンパイラは式やリテラルから型を推論し、変数の型の宣言はオプションです。

このチュートリアルで、以下のトピックを扱います:

変数

変数は名前のあるメモリ領域であり、コンパイラは変数に対応するデータ型に基づいて予約された位置に割り当てる。Scalaでは以下の構文で変数を宣言することができます。

val or val variable_name: variable_datatype = value;

上の構文では、’var’や’val’キーワードを使用して、2つの方法のいずれかで変数を定義することができます。新しい変数は’variable_name’という名前を持ち、その後にコロンを続けます。変数のデータ型は’variable_datatype’であり、これは有効などのどのようなデータ型でもできます。その後の’value’に続いて、’variable_name’に代入されます。

たとえば以下のようにします。

val varValue: Byte = 8;

‘val’は変数を定義するキーワードであり、’varValue’は変数名です。これは’Byte’のデータ型であり、値8を含んでいます。’Byte’は8ビットの符号付き値であり、2−7から27−1の範囲にあります。

上記の’variable_datatype’は、Scalaに存在する任意のデータ型であり、以下のようになります。

  1. Int: 32ビットの符号付き(正または負の値)の整数であり、2−31から231−1の範囲にあります。
  2. Byte: 8ビットの符号付き値であり、2−7から27−1の範囲にあります。
  3. Short: 16ビットの符号付き値であり、2−15から215−1の範囲にあります。
  4. Float: 32ビットまたは64ビットです。

同様に、LongCharBooleanCharStringBooleanNullなどの他のデータ型も独自の範囲を持ち、Scalaの初学者ガイドのチュートリアルで詳細な説明がある。また、’variable_datatype’は大文字から始まることが求められている、つまりIntは’I’を含んでいる。これらすべてのデータ型はScalaのオブジェクトであることを示している。

Scalaでの変数定義のルール

Scalaで変数を定義するルールと慣例は以下の通りです。

  1. 変数の名前は小文字か驼峰命名法で始まる必要があります。たとえば、変数名’nameOfGirl’は’n’を小文字で始め、その後、’O’や’G’を頭文字としてすべての単語の最初の字母を大文字にします。
  2. 変数名にScalaで定義された予約語やキーワードを含めることはできません。
  3. 変数名には’$’や’_’記号を含めることができます。しかし、その他の特殊文字(‘#’,’&’など)は使用できません。また、下划線の使用は推奨されません。
  4. 変数名には空白文字(タブ、スペース)は使用できません。
  5. 変数名は字母で始まる必要があり、数字や他の文字から始まることはできません。

可変変数

可変変数は宣言後でも変数の値を変更することができます。

可変変数のスyntaxは以下の通りです。

var variable_name : variable_datatype = value;

変更可能変数の構文は以下のように定義できる:

var variable_name = value;

変更可能変数の例は以下の通りです:

var nameOfThing: String = "Car";

上の例はvarをキーワードとして変数を定義するために使用しています。変数の名前は「nameOfThing」で、それに続くコロンは変数のデータ型「String」を指定しています。変数の値はメモリに「Car」として保存されます。

上のような変更可能変数の例で異なる構文は以下のように行えます:

var nameOfThing = "Car";

変数のデータ型を宣言せずに変数を定義することができます。Scalaコンパイラは自動的に「String」データ型に決定します。これは「型推論」と呼ばれます。

変数の値を以下のように簡単に変更することができます:

nameOfThing = "Bike"; print(nameOfThing)

変数の値は「Car」から「Bike」に変更されます。出力は「Bike」になります。なぜなら、「var」キーワードは変数の値を変更することができるからです(情報源:Scalaの変数)。

不可変変数

不可変変数は、一旦生成されるとその値を変更できない変数です。これらは「val」キーワードを使用して宣言されます。

不可変変数の構文は以下のように表示されます:

val variable_name : variable_data type = value;

不可変変数の構文は以下のように定義できます:

val variable_name = value;

不可変変数の例は以下の通りです:

val numberOfThing: Int = 2;

上記の例には、valがイミュータブル変数を定義するためのキーワードとして使用され、変数名は ‘numberOfThing’ です。コロンの後に変数のデータ型として ‘Int’ が続き、メモリに格納された値は2です。

異なる構文を使用したイミュータブル変数の上記の例は以下のように行うことができます。

val numberOfThing = 2;

変数のデータ型を指定せずに変数を定義することができます。これは、Scalaコンパイラが自動的に ‘Int’ データ型と判断するプロセスで、型推論と呼ばれます (出典: Scalaの変数)。

以下のように変数の値を変更することはできません。

numberOfThing = 7;

上記の例では “error: not found: value numberOfThing” のようなエラーが発生し、以下のように値の再割り当てが不可能であることが示されます。

複数の宣言と代入

Scalaでは、変数名をカンマで区切り、’var’ キーワードと “=” 記号を使用して、変数に値を割り当てることで複数の宣言が可能です。

var (x, y, z) = (5, 4.5, "Sit")

上記の例では、変数 x, y, z がそれぞれ値 5, 4.5, “Sit” に割り当てられていることがわかります。

Scalaでは、’val’ キーワードを使用して、変数名をカンマで区切り、”=” 記号を使用して変数に値を割り当てることで、一行で複数の代入が可能です。

val a, b, c = 1;

上記の例では、変数 a, b, c がそれぞれ値 1 に割り当てられていることがわかります。

変数のスコープ

変数の範囲は、その変数の生命周期があるコードの指定されたブロック内の視覚性を表します。変数は、ローカルまたはグローバルの範囲で宣言することができます。たとえば:

var globalVar = 10 def sub(){ var difference = 9-4; } print(difference)//エラー print(globalVar)//有効

上記のコードでは、’difference’変数は、’sub’メソッド内で宣言されるため、ローカル範囲にあります。これにより、差分の計算は有効な結果を返します。しかし、’sub’メソッドの外で値を印刷するとエラーが発生します。また、グローバル範囲もあり、’globalVar’変数はプログラムのどこでもアクセスでき、それに対するどの操作も可能です。

Scalaでは、変数の3つの種類の範囲があります(情報源: Scala- Variables):

  1. ローカル変数
  2. フィールド
  3. メソッドパラメータ

ローカル変数

ローカル変数は、メソッド内で宣言される、メソッド内にしかアクセスできない、変更可能または変更不可の変数です。

以下の簡単な例を見ることで、ローカル変数について理解できます:

class Perimeter { def triangle() { var side1 = 10; var side2 = 20; var side3 = 30; var total = side1+side2+side3; print("Perimeter of the triangle is: " + total); } } object Test { def main(args:Array[String]) { val p1 = new Perimeter() p1.triangle() } }
defined class Perimeter defined object Test

上記のコードは以下の結果を返します:

三角の周長は: 60

上記のプログラムは、’Perimeter’クラスとその’Test’オブジェクトを含んでいます。そこには、3つの変更可能な変数’side1’、’side2’、’side3’を持つ三角形という名前のメソッドが含まれています。計算と結果の印刷は、このメソッドの内部で行われ、正しい出力を返します。

Fields

クラス内で宣言された変数は、任意の型の変更可能または変更不可のフィールド変数として知られています。アクセス修飾子は、クラス内で宣言された変数の場合は自動的にpublicになり、変数がプログラム内のどこからでもアクセスできるようにするために、メソッドの中で宣言するべきではありません。しかし、private変数は、宣言されたクラスの内部からアクセスできますが、クラスのスコープの外またはオブジェクト内でもアクセスできません。

class FieldExample { var value1 = 10; private var value2 = 30; def operation() { println("Value of value1:"+value1) } println("Value of value2: "+value2); } object Demo { def Main(args:Array[String]) { val obj = new FieldExample() obj.operation() print(obj.value1)//Valid print(obj.value2) } }
defined class FieldExample defined object Demo

上記のコードは以下のような結果を与えます:

value2の値: 30
value1の値: 10
10

上記のプログラムは、’FieldExample’という名前のクラス、’Demo’という名前のオブジェクト、以及び’operation’という名前のメソッドを含んでいます。public変数value1は、点記法を使用してアクセスでき、値は10になります。private変数としてvalue2が30であり、この変数にアクセスし、印刷するとエラーが発生します。

メソッド引数

メソッドが呼び出されたときに値を受け取る変数を指します。これらの変数は、’val’キーワードを使用して宣言される必要があり、変更可能である必要があります。また、変数に参照を持った場合、メソッドの外でもアクセスできます。

以下の簡単な例を見ることで、メソッド引数について学ぶことができます:

class Triangle { def calculate(height: Int, width: Int) { var result = 0.5*(height+width); println("Area of triangle is: " + result); } } object Area { def main(args:Array[String]) { val a = new Triangle() a.calculate(4,5); } }
defined class Triangle defined object Area

上記のコードは以下のような結果を与えます:

三角形の面積: 4.5

The above text contains a class called ‘Triangle.’ It includes a method called ‘calculate’ with two method parameters, height and width. The integer values 4 and 5 are passed when ‘calculate’ is called using the object instance a.

結論

おめでとうございます。このチュートリアルの最後に到達しました!

このチュートリアルでは、Scalaの変数、変数定義のルール、複数の宣言と代入による異なる種類の変数、および変数のスコープについて学びました。

Scalaについてもっと学びたい場合は、DataCampのScala入門コースを受講してください。

Source:
https://www.datacamp.com/tutorial/variables-in-scala