このページはScala 公式ドキュメントを参照して作成されたものです
Scalaとは
オブジェクト指向言語と関数型言語二つの特徴を統合したプログラミング言語です。小さなスクリプトから大きなシステムまで同じ概念で実現できるスケーラブルな言語仕様が特徴です。
環境構築よりもまずはScalaを使ってみたいという方はScasiteというサイトがおすすめです。
ブラウザ上にScalaの実行環境が整っており、すぐにScalaのプログラムを実行することが出来ます。
Values
valキーワードを利用することで、式の結果に名前を付けることができます。
1 2 |
val x = 1 + 1 println(x) // 2 |
ここでいうところの x のように、名前をつけられた結果は Values と呼ばれます。
値は再代入することができません。
また、このように型を明示的に宣言することもできます。
1 |
val x: Int = 1 + 1 |
型定義ではInt は識別子xの後にくることに注意してください。そして:も必要となります。
Variables
varキーワードを使うことで、変数を定義することが出来ます。
1 2 3 |
var x = 1 + 1 x = 3 // "x"は"var"キーワードで宣言されているので、これはコンパイルされます。 println(x * x) // 9 |
Valuesと同様に、型を宣言したければ、明示的に型を宣言することができます。
1 |
var x: Int = 1 + 1 |
ブロック
{}で囲むことで式をまとめることができます。これをブロックと呼びます。
ブロックの最後の式の結果はブロック全体の結果にもなります。
1 2 3 4 |
println({ val x = 1 + 1 x + 1 }) // 3 |
Functions
Functions(関数)は下記のように定義することが出来ます。
ここでは与えられた数値に1を足す無名関数(すなわち名前が無い関数)を宣言しています。
1 |
(x: Int) => x + 1 |
=> の左側はパラメーターのリストです。右側はパラメーターを含む式です。
関数には名前をつけることもできます。
1 2 |
val addOne = (x: Int) => x + 1 println(addOne(1)) // 2 |
また、関数は複数のパラメーターをとることもできます。
1 2 |
val add = (x: Int, y: Int) => x + y println(add(1, 2)) // 3 |
またパラメーターを取らないこともありえます。
1 2 |
val getTheAnswer = () => 42 println(getTheAnswer()) // 42 |
Methods
methodはfunctionととても似ていますが、いくつかの違いがあります。
- methodは def キーワードで定義されます。 def の後ろには名前、パラメーターリスト、戻り値の型、処理の内容が続きます。
1 2 |
def add(x: Int, y: Int): Int = x + y println(add(1, 2)) // 3 |
戻り値の型は引数リストとコロンの「後ろ」に宣言することに注意してください。: Int
- methodは複数のパラメーターリストを受け取ることができます。
1 2 |
def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier println(addThenMultiply(1, 2)(3)) // 9 |
また、パラメーターリストを一切受け取らないこともあります。
1 2 |
def name: String = System.getProperty("user.name") println("Hello, " + name + "!") |
メソッドと関数には他にも違いがありますが、今のところは同じようなものと考えて大丈夫です。
- メソッドは複数行の式も持つことができます。
1 2 3 4 5 |
def getSquareString(input: Double): String = { val square = input * input square.toString } println(getSquareString(2.5)) // 6.25 |
メソッド本体にある最後の式はメソッドの戻り値になります。(Scalaにはreturnキーワードはありますが、めったに使われません。)
Classes
class キーワードとその後ろに名前、コンストラクタパラメーターを続けることで、クラスを定義することができます。
1 2 3 4 |
class Greeter(prefix: String, suffix: String) { def greet(name: String): Unit = println(prefix + name + suffix) } |
greet メソッドの戻り値の型はUnitです。Unitは戻り値として意味がないことを示します。 それはJavaやC言語のvoidと似たような使われ方をします。
new キーワードを使うことで、クラスのインスタンスを生成することができます。
1 2 |
val greeter = new Greeter("Hello, ", "!") greeter.greet("Scala developer") // Hello, Scala developer! |
Case Classes
ScalaにはCase Classという特別な種類のクラスがあります。デフォルトでケースクラスは不変であり、値で比較されます。 case class キーワードを利用して、ケースクラスを定義できます。
1 |
case class Point(x: Int, y: Int) |
ケースクラスは、new キーワードなしでインスタンス化できます。
1 2 3 |
val point = Point(1, 2) val anotherPoint = Point(1, 2) val yetAnotherPoint = Point(2, 2) |
ケースクラスは値で比較されます。
1 2 3 4 5 6 7 8 9 10 11 |
if (point == anotherPoint) { println(point + " と " + anotherPoint + " は同じです。") } else { println(point + " と " + anotherPoint + " は異なります。") } // Point(1,2) と Point(1,2) は同じです。 if (point == yetAnotherPoint) { println(point + " と " + yetAnotherPoint + " は同じです。") } else { println(point + " と " + yetAnotherPoint + " は異なります。") } // Point(1,2) と Point(2,2) は異なります。 |
Object
オブジェクトはそれ自体が定義である単一のインスタンスです。
objectキーワードを利用してオブジェクトを定義することができます。
1 2 3 4 5 6 7 |
object IdFactory { private var counter = 0 def create(): Int = { counter += 1 counter } } |
名前を参照してオブジェクトにアクセスすることができます。
1 2 3 4 |
val newId: Int = IdFactory.create() println(newId) // 1 val newerId: Int = IdFactory.create() println(newerId) // 2 |
他にもScalaの要素は様々なものがあり、このチュートリアルでは説明しきることは出来ません。
是非、公式のドキュメントやその他資料を参考にしてみて下さい。
Scala 公式のCheat sheet等も良くまとまっており、おすすめです。
あなたも、Avintonでこのような最先端技術を習得し活用してみませんか?
社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?