11. Hello World!
def twice(x: Int): Int = {
x * 2
}
def twice(x: Int): Int = x * 2
式式
{} はあくまでブロック式
メソッド宣言とは無関係
2018-11-10ゼロから始めるScalaプロジェクト
11
12. 式と文
val result = {
val x = 1 + 2
if (x < 0) x else x * 2
}
ブロック式
順
番
に
評
価
最後に評価された式の返り値が
ブロック式全体の返り値になる
最後に評価された式の返り値が
ブロック式全体の返り値になる
6: Int
resultには
6が代入される
if式
(≒3項演算子)
2018-11-10ゼロから始めるScalaプロジェクト
12
代入文
13. 式と文
val result = {
val x = 1 + 2
if (x < 0) x else x * 2
}
式
文
2018-11-10ゼロから始めるScalaプロジェクト
13
14. for式 (ループもできる)
for {i <- 1 to 3} {
println(i)
}
for {i <- 1 to 3} println(i)
val results = for {i <- 1 to 3} i
ブロック式
式式
ジェネレータ 1,2,3 から成る数値列の生成
このままでは値を返さな
い
(): Unit
2018-11-10ゼロから始めるScalaプロジェクト
14
15. for式
val results1 = for {i <- 1 to 3} yield i
val results2 = for {
i <- 1 to 5 by 2
j <- 2 to 1 by -1
} yield {
val x = i * j
x + 1
}
yield を付けると値を返す1,2,3
1,3,5
2,1
3,2,7,4,11,6
ジェネレータを
複数並べること
で
多重ループ
ループに再代入可能な変数は不
要
to: <=, until: <, by: += n
2018-11-10ゼロから始めるScalaプロジェクト
15
16. match式
val n = 2
val result = n match {
case 1 =>
"1"
case 2 | 3 =>
"2 or 3"
case x if x % 2 == 0 =>
"偶数の" + x.toString
case x =>
s"それ以外の${x}"
}上記以外にも
様々な条件を指定可能
対象
定数による条件
OR条件
全てにマッチす
るx
+ 偶数である
全てにマッチする
x
"2 or 3"
順
番
に
評
価
最初にマッチした
箇所のみ実行され
る
(break不要)
2018-11-10ゼロから始めるScalaプロジェクト
16
17. match式
val n = 5
val result = n match {
case 1 =>
"1"
case 2 | 3 =>
"2 or 3"
case x if x % 2 == 0 =>
"偶数の" + x.toString
case x =>
s"それ以外の${x}"
}上記以外にも
様々な条件を指定可能
対象
定数による条件
OR条件
全てにマッチす
るx
+ 偶数である
全てにマッチする
x
"それ以外の5"
順
番
に
評
価
文字列化
式を埋め込み可能な文字列式を埋め込み可能な文字列
2018-11-10ゼロから始めるScalaプロジェクト
17
18. クラス?オブジェクト?トレイト
class Triangle(edges: Array[Int]) {
val area = ??? // 省略
def printFigure(): Unit = println("△")
}
val triangle = new Triangle(Array(3, 4, 5))
println(triangle.area)
コンストラクタ引数リ
スト
フィールドそのもの
が
コンストラクタにな
るインスタンス
化
6.0 ??? は未実装例外のエイリアス
仮にコンパイルを通すのに便利
2018-11-10ゼロから始めるScalaプロジェクト
18
19. クラス?オブジェクト?トレイト
abstract class Polygon(edges: Array[Int]) {
val n = edges.size
val area: Double
def printFigure(): Unit
}
class Triangle(edges: Array[Int]) extends Polygon(edges)
{
val area = ??? // 省略
def printFigure(): Unit = println("△")
}
val triangle = new Triangle(Array(3, 4, 5))
println(triangle.area)
抽象クラ
ス
継承
2018-11-10ゼロから始めるScalaプロジェクト
19
+α
20. クラス?オブジェクト?トレイト
abstract class Polygon private(edges: Array[Int]) {
val n = edges.size
val area: Double
def printFigure(): Unit
}
object Polygon {
def fromEdges(edges: Array[Int]): Polygon =
edges.size match {
case 3 => new Triangle(edges)
case 4 => new Square(edges)
case n => ???
}
}
Polygon.fromEdges(Array(3, 4, 5))
オブジェクト (≒staticフィール
ド)
Triengle
同名のクラスが同一ファイル
にあるオブジェクトを
コンパニオンオブジェクトと
呼ぶ
privateにアクセスできる
privateコンストラクタ
2018-11-10ゼロから始めるScalaプロジェクト
20
+α
21. クラス?オブジェクト?トレイト
import java.util.Date
trait Tag {
val createdDate: Date
}
trait Color {
val rgb: RGB
}
class TaggedGreenTriangle
extends Triangle with Tag with Color {
val rbg = new RGB(0, 255, 0)
val createdDate = new Date
}
トレイト: 多重継承可, コンストラクタ引数
なし
抽象クラスに似ている
が
一部機能が異なる.
どちらも利用できて
迷ったらトレイト
インポート (クラス, オブジェクト, メソッ
ド等)
別名ミックスイ
ン
2つ目以降は with で繋ぐ
2018-11-10ゼロから始めるScalaプロジェクト
21
22. コレクション?関数
val list1 = (1 to 3).toList
val list2 = List(1, 2, 3)
val array = Array(1, 2, 3)
val odds1 = list1.filter(x => x % 2 == 1)
val odds2 = array.filter(x => x % 2 == 1)
val sum = list1.sum
val twice = list1.map(x => x * 2)
val sorted = list1.sorted
Range: 範囲から生成されるコレクショ
ン
同一I/F
List (単方向) に変換
直接 List の初期化
Array (中身はJava配列)
多様な便利API
1,2,31,2,31,2,3
1,31,3
6
2,4,6
1,2,3
2018-11-10ゼロから始めるScalaプロジェクト
22
23. コレクション?関数
val list = (1 to 3).toList
val odds1 = list.filter(x => x % 2 == 1)
val selectOdd: Int => Boolean = x => x % 2 == 1
val odds2 = list.filter(selectOdd)
匿名関数のラムダ記
法
匿名関数のラムダ記
法
仮引数仮引数 式式要シグネチャ
filterは (T => Boolean) 型を引数に取り各要素で実行
: List[Int]
T が Int
デフォルトは不変コレクション (Arrayは例
外)
import scala.collection.mutable.XXX
で可変コレクションも利用可能
2018-11-10ゼロから始めるScalaプロジェクト
23