Scastieを利用することでブラウザ上でScalaを実行することができる
式
- 式とは評価すると結果が得られるもの
printlnを使用することで、式の結果を出力できるprintln(1) // 1 println(1 + 1) // 2 println("Hello!") // Hello! println("Hello," + " world!") // Hello, world!
値
valキーワードを利用することで、式の結果に名前をつけることができる
val x = 1 + 1
println(x) // 2- 上記のような
xのように、名前をつけられた式の結果を値と呼び、式の結果に名前をつけているため、値を参照しても再計算はされない。また、値は再代入することもできない
x = 3 // Reassignment to val x- 値の型は推論可能だが、明示的に型宣言することもできる
val x: Int = 1 + 1変数
varキーワードを使うことで変数を定義できる。変数は再代入可能- 値と同様に明示的に型宣言することもできる
var x = 1 + 1
println(x) // 2
x = 3
println(x) // 3
var y: Int = 2 + 2
println(y) // 4ブロック
{}で囲むことで式をまとめることはができる。これをブロックと呼ぶ
println({
val x = 1 + 1
x + 1
}) // 3関数
- パラメータを受け取ることのできる式のことを関数と呼ぶ
// 無名関数
(x: Int) => x + 1
// 名前付き関数
val addOne = (x: Int) => x + 1
println(addOne(1)) // 2
val add = (x: Int, y: Int) => x + y
println(add(1, 2)) // 3- パラメータを受け取らない関数も定義することもできる
val getTheAnswer = () => 42
println(getTheAnswer()) // 42メソッド
- メソッドと関数は見た目や振る舞いが似ているが、違いがいくつかある。メソッドは
defキーワードで定義され、defの後には名前とパラメータリスト、戻り値の型、処理の内容が続く
def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9- パラメータリストを受け取らないメソッドも定義できる
def name: String = System.getProperty("user.name")
println("Hello, " + name + "!") // Hello, sbtRunnerContainer!- メソッドには複数業の式を含めることもできる
// Scala3記法
def getSquareString(input: Double): String =
val square = input * input
square.toString
println(getSquareString(2.5)) // 6.25クラス
- クラスは
classキーワードで定義され、classの後には名前とコンストラクタパラメータが続く
// Scala3記法
class Greeter(prefix: String, suffix: String)
def greet(name: String): Unit =
println(prefix + name + suffix)greetメソッドの戻り値はUnitで、Unitは戻り値として意味がないことを示す。他言語のvoidと同様な使用のされかたをする(違いとしては、Scalaのすべての式には何らかの値が必要であるため、実際にはUnit型の単一値()が存在する。これは情報を含まない)newキーワードを使うことでクラスのインスタンスを生成することができる
// Scala3記法
val greeter = Greeter("Hello, ", "!")
greeter.greet("Scala developer") // Hello, Scala developer!ケースクラス
- Scalaにはケースクラスと言う特別なクラスがある。デフォルトでケースクラスは不変。
case classキーワードで定義され、case classの後には名前とコンストラクタパラメータが続く
case class Point(x: Int, y: Int)- ケースクラスは、
newキーワードなしでインスタンス化でき、値で比較される
val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)
// Scala3記法
if point == anotherPoint then
println(s"$point and $anotherPoint are the same.")
else
println(s"$point and $anotherPoint are different.") // Point(1,2) and Point(1,2) are the same.
if point == yetAnotherPoint then
println(s"$point and $yetAnotherPoint are the same.")
else
println(s"$point and $yetAnotherPoint are different.") // Point(1,2) and Point(2,2) are different.オブジェクト
objectキーワードは、インスタンスをシングルトンとして定義したい場合に使用する
// Scala3記法(ブロックがいらない)
object IdFactory:
private var counter = 0
def create(): Int =
counter += 1
counter
val newId: Int = IdFactory.create()
println(newId) // 1
val newerId: Int = IdFactory.create()
println(newerId) // 2トレイト
traitキーワードで定義できるトレイトは、特定のフィールドとメソッドを含む抽象データ型。Scalaの継承では、クラスは他のクラスを1つしか継承できないが、トレイトは複数継承できる
// Scala3記法
trait Greeter:
def greet(name: String): Unit- デフォルトの実装も定義できる
// Scala3記法
trait Greeter:
def greet(name: String): Unit =
println("Hello, " + name + "!")extendsキーワードを使用してトレイトを拡張したり、overrideキーワードを使用してメソッドをオーバーライドできる
// Scala3記法
class DefaultGreeter extends Greeter
class CustomizableGreeter(prefix: String, postfix: String) extends Greeter:
override def greet(name: String): Unit =
println(prefix + name + postfix)
val greeter = DefaultGreeter()
greeter.greet("Scala developer") // Hello, Scala developer!
val customGreeter = CustomizableGreeter("How are you, ", "?")
customGreeter.greet("Scala developer") // How are you, Scala developer?エントリポイント
mainメソッドは Scalaのエントリポイントで、JVMでは、文字列の配列を引数として取るmainメソッド が必要
// Scala2記法(mainメソッドを手動で定義する必要がある。オブジェクトを使用すると、mainメソッドは次のように定義できる)
object Main {
def main(args: Array[String]): Unit =
println("Hello, Scala developer!")
}
// Scala3記法(手動で定義しても良いが、@mainアノテーションを使用すると、次のようにメソッドからmainメソッドが自動的に生成される)
@main def hello() = println("Hello, Scala developer!")次章:統一型