2013-12-08 西区プログラム勉強会

360 views

Published on

初心者向けの発表です
発表時間が15分だったのでトレイトなどの話は省略してます

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
360
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2013-12-08 西区プログラム勉強会

  1. 1. SCALA始めてみました 第6回福岡市西区プログラム勉強会
  2. 2. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 Scala • この頃何かと話題のScala • 採用事例 Twitter, Foursquare, LinkedIn • ウェブ開発 Play framework • 各地勉強会 • 本発表では • 基本構文から特徴的機能を紹介して Scalaの魅力を伝える • 基本情報 • 登場時期 • 設計者 • 安定バージョン • 開発バージョン 2003年頃 Martin Odersky 2.10.3 2.11.0-M7 2
  3. 3. 2013年 12月 8日 Scala 第6回福岡市西区プログラム勉強会 3
  4. 4. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 Scalaの特徴 • 純粋なオブジェクト指向言語 • クラスベース継承 • traitによるミックスイン合成 • 静的型付け関数型言語 • 型推論機構によって簡潔な記述ができる • 関数型とは 関数も値と同等に扱う • 定数・変数を扱える • 簡潔・柔軟な記述が可能 • スケーラブル • 拡張性を持った言語 • 並列コレクション・アクター • Javaとの互換性 • JVM上で動く • JavaとScalaを相互に利用可能 4
  5. 5. 2013年 12月 8日 基本構文 第6回福岡市西区プログラム勉強会 5
  6. 6. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 変数 • Byte, Short, Int, Long, Char, String, Float, Double, Boolean • すべてオブジェクトとして扱われる • 変数宣言 • val 変数名: 型名 = 初期値 val name: String = “John” • var 変数名: 型名 = 初期値 var age: Int = 10 • 型推論によって自動的に型が決まる • val num = 10.0 // => num: Double = 10.0 • 型名を省略することができる • val と var • val – 変数の値を変更できない(定数) • var – 変数の値を変更できる (変数) 6
  7. 7. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 制御文 • 条件分岐 • if (条件) { // code } else { // code } • ループ • あまり使わない • while val atoz = 'a' to 'z' var i = 0 while(i < atoz.length) { println(atoz(i)) i += 1 } ・for for (num <- 1 until 10) println(num) 7
  8. 8. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 制御文 • ループ atoz.foreach((c: String) => { println(c) }) 型推論 atoz.foreach(c => println(c)) プレースホルダー args.foreach(println(_)) 省略可能 args.foreach(println) 8
  9. 9. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 関数 関数の宣言 関数名 戻り値の型 def add(a: Int, b: Int): Int = { a + b 引数 } 最後の行が戻り値 デフォルト引数 def add(a: Int, b: Int = 10) = a + b 部分適用 def add(a: Int)(b: Int): Int = a + b val twoAdd = add(2)_ println(twoAdd(5)) // 7 9
  10. 10. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 10 クラス • フィールドとメソッドを持つ • コンストラクタ • クラス内に記述 • 補助コンストラクタ • Javaより簡潔に書ける Scala Java class val val def } public class Person { private String name; private int age; Person(p: String, n: Int) { name = p age = n this(p: String) = this(p, 20) public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this(name, 10); } }
  11. 11. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 いくつかの機能・構文 11
  12. 12. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 例えばこんなコード package jp.samples object HelloScala { def main(args: Array[String]): Unit = { import model.{ Person => CasePerson } val p1 = CasePerson("John", 20) p1.grow println(p1.hello) println(p1) } } package model { case class Person(val name: String, private var age: Int = 20) { require(name != "") require(age > 0) def hello(): String = s"Hello, $name" def grow: Int = { age += 1 age } } } 12
  13. 13. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 13 例えばこんなコード package jp.samples object HelloScala { def main(args: Array[String]): Unit = { import model.{ Person => CasePerson } val p1 = CasePerson("John", 20) p1.grow println(p1.hello) println(p1) } } Object import文 caseクラス package model { case class Person(val name: String, private var age: Int = 20) { require(name != "") require(age > 0) require文 def hello(): String = s"Hello, $name" def grow: Int = { age += 1 age } } } 加工文字列リテラル
  14. 14. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 Object • 単一オブジェクト • 言語レベルでのシングルトンサポート • main関数はObjectに書く object HelloScala { def main(args: Array[String]): Unit = { // code } } 14
  15. 15. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 caseクラス • newキーワードが不要 • toString, hashCode, equalsの自動実装 case class Person(val name: String, val age: Int) scala> val p1 = Person("John", 20) p1: Person = Person(John,20) class Person(val name: String, val age: Int) scala> val p1 = new Person("John", 20) p1: Person = Person@32076ee4 15
  16. 16. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 16 require文 • インスタンス生成時に引数チェックが可能 • 条件を満たさないと”IllegalArgumentException”を出す case class Person(val name: String, private var age: Int = 20) { require(name != "") require(age > 0) }
  17. 17. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 import文 • 柔軟なインポート import java.math._ import java.util.{ List, ArrayList } import model.{ Person => CasePerson } • 指定したパッケージの全クラス • 指定したクラスのみ • インポートクラスに別名を与える • 任意の場所に書ける • 入れ子構造 package jp.samples package model { case class Person(val name: String, val age: Int) { require(name != "") require(age > 0) } } 17
  18. 18. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 18 加工文字リテラル (processed string literal) • 文字列の前にリテラルをつけることでコンパイラが 追加処理をしてくれる • 補間子 • s 補間子 - 変数を直接扱える • 例:val value = “fuga” s”hoge $value” • f 補間子 // hoge fuga - 書式付き文字列 • 例:f”$name%s $height%2.2f meters” // James is 1.90 meters • raw 補間子 - エスケープなし • 例:raw”abnc” // abnc • 独自補間子も定義可能
  19. 19. 2013年 12月 8日 パターンマッチ 第6回福岡市西区プログラム勉強会 19
  20. 20. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 パターンマッチ • 非常に強力なマッチング • 複数の選択肢から一つを選択 • _(アンダースコア)でdefaultの働き • 値を返す • 定数マッチ val str = readLine val msg = str match { case "hello" => str + " world" case "welcome" => str + " to scala" case _ => "wrong" } println(msg) 20
  21. 21. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 パターンマッチ • コンストラクターパターン • クラスメンバーまでチェック object MatchSample { def main(args: Array[String]): Unit = { val p1: Any = Person(“John”, 20) p1 match { case Person(“John”, _) => println(“He is John”) case Person => println(“Person”) } } } case class Person(name: String, age: Int) 21
  22. 22. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 22 パターンマッチ • 型付きパターン • case 変数名: 型名 => { } • キャストの代用 object MatchSample { def main(args: Array[String]): Unit = { val p1: Any = Person("John", 20) p1 match { case person: Person => println("Person " + person.name) case animal: Animal => println("Animal is" + animal.aType) } } } case class Person(name: String, age: Int) case class Animal(name: String, aType: String)
  23. 23. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 23 パターンマッチ • パターンガード • マッチした後にさらに条件を加える object MatchSample { def main(args: Array[String]): Unit = { val p1: Any = Person("John", 20) p1 match { case person: Person if person.name == "John" => { println("John " + person.age) } case person: Person => println("Person " + person.name) case animal: Animal => println("Animal is" + animal.aType) } } } case class Person(name: String, age: Int) case class Animal(name: String, aType: String)
  24. 24. 2013年 12月 8日 リスト操作 第6回福岡市西区プログラム勉強会 24
  25. 25. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 25 リスト操作 • アクセス • head • tail • init • last scala> val alpha = ('a' to 'e').toList リストの先頭の要素 alpha: List[Char] = List(a, b, c, d, e) 先頭以外の要素 scala> alpha.head 最後以外の要素 res1: Char = a リストの最後の要素 scala> alpha.tail res2: List[Char] = List(b, c, d, e) scala> alpha.init res3: List[Char] = List(a, b, c, d) scala> alpha.last res4: Char = e
  26. 26. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 26 リスト操作 • 例えば • 名前のリストから頭文字がJの名前を抽出して小文字にして返す Java List<String> nameList = Arrays.asList("Alice", "John", "Jack", "Paul"); for (String name : nameList) { List<String> jList = new ArrayList<>(); if (name.startsWith("J")) { jList.add(name.toLowerCase()); } } Scala val nameList = Array("Alice", "John", "Jack", "Paul") val jList = nameList .filter(_.startsWith("J")) .map(_.toLowerCase())
  27. 27. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 リスト操作 • filter リストから条件に合う要素を抽出 scala> (1 to 10).filter(_ > 5).toList res1: List[Int] = List(6, 7, 8, 9, 10) • map 要素を変換する scala> (1 to 10).map(_ * 10).toList res2: List[Int] = List(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) 27
  28. 28. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 リスト操作 • toListリストに変換する • toSet Setに変換 scala> List(1, 1, 2, 3, 5, 5).toSet.toList res3: List[Int] = List(1, 2, 3, 5) • mkString 要素を文字列に scala> (1 to 5).mkString("num(", ", ", ")") res4: String = num(1, 2, 3, 4, 5) scala> (1 to 5).mkString(", ") res5: String = 1, 2, 3, 4, 5 28
  29. 29. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 リスト操作 • sum 要素の合計 scala> (1 to 10).sum res1: Int = 55 • product 要素の積 scala> (1 to 10).product res2: Int = 3628800 • min 最小要素 scala> (1 to 10).min res3: Int = 1 • max 最大 scala> (1 to 10).max res4: Int = 10 29
  30. 30. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 並列・並行処理 • 並列コレクション • 手軽に並列処理を行える • 逐次処理 (1 to 100000).sum • 並列処理 (1 to 100000).par.sum • Actor • 各アクターがメッセージパッシングで処理を行う 30
  31. 31. 2013年 12月 8日 並列・並行処理 • アクター object ActorSample { def main(args: Array[String]): Unit = { myActor ! 10 } import scala.actors.Actor import scala.actors.Actor._ val myActor = actor { loop { react { case i: Int => println("loop react = " + i) } } } } 第6回福岡市西区プログラム勉強会 31
  32. 32. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら Scalaスケーラブルプログラミング第2版 http://amzn.to/1bOKPBN 32
  33. 33. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら http://www.scala-lang.org/documentation/ 33
  34. 34. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら http://docs.scala-lang.org/ja/overviews/index.html 34

×