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

  • 125 views
Uploaded on

初心者向けの発表です …

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
125
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. SCALA始めてみました 第6回福岡市西区プログラム勉強会
  • 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. 2013年 12月 8日 Scala 第6回福岡市西区プログラム勉強会 3
  • 4. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 Scalaの特徴 • 純粋なオブジェクト指向言語 • クラスベース継承 • traitによるミックスイン合成 • 静的型付け関数型言語 • 型推論機構によって簡潔な記述ができる • 関数型とは 関数も値と同等に扱う • 定数・変数を扱える • 簡潔・柔軟な記述が可能 • スケーラブル • 拡張性を持った言語 • 並列コレクション・アクター • Javaとの互換性 • JVM上で動く • JavaとScalaを相互に利用可能 4
  • 5. 2013年 12月 8日 基本構文 第6回福岡市西区プログラム勉強会 5
  • 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. 第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. 第6回福岡市西区プログラム勉強会 2013年 12月 8日 制御文 • ループ atoz.foreach((c: String) => { println(c) }) 型推論 atoz.foreach(c => println(c)) プレースホルダー args.foreach(println(_)) 省略可能 args.foreach(println) 8
  • 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. 第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. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 いくつかの機能・構文 11
  • 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. 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. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 Object • 単一オブジェクト • 言語レベルでのシングルトンサポート • main関数はObjectに書く object HelloScala { def main(args: Array[String]): Unit = { // code } } 14
  • 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. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 16 require文 • インスタンス生成時に引数チェックが可能 • 条件を満たさないと”IllegalArgumentException”を出す case class Person(val name: String, private var age: Int = 20) { require(name != "") require(age > 0) }
  • 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. 第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. 2013年 12月 8日 パターンマッチ 第6回福岡市西区プログラム勉強会 19
  • 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. 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. 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. 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. 2013年 12月 8日 リスト操作 第6回福岡市西区プログラム勉強会 24
  • 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. 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. 第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. 第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. 第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. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 並列・並行処理 • 並列コレクション • 手軽に並列処理を行える • 逐次処理 (1 to 100000).sum • 並列処理 (1 to 100000).par.sum • Actor • 各アクターがメッセージパッシングで処理を行う 30
  • 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. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら Scalaスケーラブルプログラミング第2版 http://amzn.to/1bOKPBN 32
  • 33. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら http://www.scala-lang.org/documentation/ 33
  • 34. 2013年 12月 8日 第6回福岡市西区プログラム勉強会 もっとScalaを学習したいなら http://docs.scala-lang.org/ja/overviews/index.html 34