Scalaの基本的な文法


Scalaの基本的な文法についての紹介です。Hello Worldの流れや型の定義、Scala特有の機能を紹介します。

🐮 MacへのScalaのインストール

HomebrewでScalaをインストール。

brew install scala sbt

🤔 Hello World

HelloWorld.scalaを作成。

object HelloWorld {
def main(args: Array[String]): Unit {
println("Hello World!")
}
}

build.sbtを作成して以下を記入。

scalaVersion := "2.12.2"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")

次のコマンドでコンパイルして実行。

sbt
#...
> run #=> Hello World!

🎉 コンソールを呼び出す

ScalaのREPLの呼び出しはsbt consoleで呼び出せます。

sbt console

REPLの終了は:quit or :q

🚕 コメント

// コメントA
/* コメントB */
/**
* コメントC
*/

🐰 変数

var 変数:型 = 値の形式。型は型推論で省略が可能。

var id:Int = 1
var str:String = "abc"
var flag:Boolean = _ // _で初期値が設定される

varは再代入可能な変数(mutable)、valは再代入ができない変数(immutable)を示す。

var y = 1
y = 2 // エラーは出ない

val x = 3
x = 4 // valだとエラーになる

🐹 定数

val 変数:型 = 値の形式。

val NUM:Int = 1

🚜

Javaでの型 説明 初期値
Boolean boolean truefalseの真偽値 false
Char char 1文字(2byte) \0
String String 文字列 null
Int int 32bitの整数 0
Long long 64bitの整数 0
Float float 32bitの浮動小数 0.0
Double double 64bitの浮動小数 0.0

🍣 文字列補完

s"..."とすると$xxxの変数を展開して文字列置換してくれます。

val name = "hoge"
val value = 404
s"$name room number is $value"
// => hoge room number is 404

🍄 Tuple

複数のデータを格納できるコンテナ型で、違う型も格納できる。22個が格納できるオブジェクトの上限。

val t = (1, "hoge", 2.2)

😀 Unit

Unitは戻り値のない型。voidと同じもの。

🎃 制御文

// if
if (true) println("A") else println("B")

// while
while (true) println("A")

// for
for (i <- (1 to 9)) {
println(i)
} // => 1 2 3 4 5 6 7 8 9

// match (Switch文的なもの)
var one = 1
one match {
case 1 => println("one")
case 2 => println("two")
case _ => println("other")
}

🐝 関数

// 通常の書き方
def sum_num(a: Int, b: Int): Int = {
return a + b
}

// ワンライナー
def sum_num(a: Int, b: Int) = a + b

returnは省略可能で、省略時は最後の文が評価されます

def hoge(): String = {
"hoge" + "hoge"
}

この場合の{}{}式です。メソッド構文に特別に{}が含まれているわけではないです。

🐠 クラス

クラスのフィールドはvalgetterのみ提供、vargettersetterを提供。

class Dog(_name: String, _age: Int) { // コンストラクタ
val name = _name // getterのみ提供
var age = _age // getterとsetterを提供

def say(msg: String): String = {
name + ": " + msg + "ですワン"
}
}
println(new Dog("ぽち").say("ハロー")) //=> ぽち: ハローですワン

継承はextends、メソッドオーバーライドする際はoverride修飾子を追加。

class GoldenRetriever(_name: String, _age: Int) extends Dog(_name: String, _age: Int) {
override def say(msg: String): String = {
name + ": " + msg + "ですゴールデン!"
}
}
println(new GoldenRetriever("ぷち", 10).say("こんにちは")) //=> ぷち: こんにちはですゴールデン!

そのほかにもprivate, protected修飾子などがあります。

😸 例外処理

trycatchは値を返すが、finallyは値を返さないので注意。

try {
// do Something
catch {
case e: IOException => // do Something
finally {
// do Something
}

🍮 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍