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!")

次章:統一型