SlideShare a Scribd company logo
Scalaミニチュートリアル
~Introduction to Scala~


 筑波大学大学院システム情報工学研究科
        水島 宏太
はじめに
 Scalaの概要について構文ごとに説明します
 Javaと特に異なる文法については

  Javaと比較して説明します
 ディープなScalaの話はしません

 スカラの話はしません
Scala?
   最近話題の言語
       Matzにっき など
       Actorライブラリなどで注目を集めている
       ポストJava?
   静的型付けオブジェクト指向関数型言語
   作者:Martin Odersky
       JavaへのGenerics導入の貢献者の一人
   JVM上で動作する処理系
   近代的な言語仕様
関数型言語?
   明確な定義は無い
       副作用無しのスタイルを積極的にサポート?
       OOPと同じくらい曖昧
   具体例
       純粋:Haskell
       非純粋:Scala,SML,OCaml,Scheme,...
       関数型ではない:C,C++,Java,C#,Ruby,...
hello, world
object HelloWorld {
  def main(args :Array[String]) :Unit = {
    println("hello, world")
  }
}
      objectでシングルトンオブジェクトを定義(後述)
      defでメソッド定義
      Array[String] ≒ String[]
      Unit ≒ void
      以降、mainの定義は省略
変数の宣言(varとval)
var x = 1 // ≒ var x :Int = 1
var y = 2 // ≒ var y :Int = 2
val z = x + y // ≒ val z :Int = x + y
println(z)
      varで変数(変更可能)を宣言
          Javaの通常の変数と同じ
          変数の型は省略可能(右辺の型から推論される)
      valで変数(変更不能)を宣言
          Javaのfinalな変数
          変数の型は省略可能
条件分岐(if)
val num = args(0).toInt
println(
  if(num % 2 == 0) "偶数" else "奇数"
)
      Javaのifに類似
      elseを書くと値を返すことができる
          Javaの?:演算子と同じようにも使える
      elseを書かない場合Unit型の値が返る
forによる繰り返し(1)
var sum = 0
for(arg <- args) sum += arg.toInt
println(sum)
      コマンドライン引数の合計値を計算するプロ
       グラム
      forでコレクションの要素について繰り返し
          Javaの拡張for文に類似
              実際には拡張for文よりも強力
          argの型は省略可能(推論される)
forによる繰り返し(2)
for(i <- 1 to 100) {
  println(if(i%15 == 0) "FizzBuzz" else if(i%3 == 0) "Fizz"
          else if(i%5 == 0) "Buzz" else i.toString)
}
      Fizz Buzzプログラム
      x to yでxからyまでのRangeを生成
        x.to(y)と同じ意味(.や()などを省略可能)

      ifが値を返す
        elseを省略した場合は、Unit型の値を返す

      整数もオブジェクト → メソッドが呼び出せる
whileによる繰り返し
var sum = 0
var i = 0
while(i < args.length) {
  sum += args(i).toInt
  i += 1
}
println(sum)
      コマンドライン引数の合計値を計算
      forよりも冗長だが、forよりも高速
          性能をチューニングしたいときに使う
高階関数(1)
println(args.foldLeft(0)((sum, n) => sum+n.toInt))
      コマンドライン引数の合計値を計算するプロ
       グラム
      (x,...) => ...で無名関数を定義
          Javaの無名クラスのようなもの
          無名関数の引数の型が推論可能なときは省略可能
      foldLeft: 関数を引数に取るメソッド(高階関数)
          ...f(f(f(0, args(0)), args(1)), args(2))...
          関数型言語でループを書くための一般的な方法
高階関数(2)
println((0/:args)(_+_.toInt))
      コマンドライン引数の合計値を計算するプロ
       グラム
      /: ≒ foldLeft
          末尾に:の付いた演算子は左右逆に適用
              (x /: y)(z) → y./:(x)(z)
      _+_.toInt ≒ (x, y) => x+y.toInt
          式に「穴を開けた」無名関数を定義
高階関数(3)
import java.io._
def open(path :String)(block :InputStream => Unit) {
  val in = new FileInputStream(path)
  try { block(in) } finally { in.close; println("closed") }
}
open("hoge.txt"){in => () } // inは自動的にcloseされる
      リソースが自動的にcloseされるopen
      X => Y:「Xを受け取ってYを返す関数」の型
          InputStream => Unit
           「InputStreamを受け取り何も返さない関数」
          引数無しメソッドの呼び出しの()は省略可能
クラス定義(1)
class HelloWorld {
  def display() :Unit = println(toString())
  override def toString() = "hello, world"
}
(new HelloWorld).display // hello, world
      classに続けてクラス名を記述
        Javaとほぼ同じ

      返り値の型は省略可能(推論される)
      overrideでメソッドをオーバーライド
        Javaの@Overrideアノテーションと同じ

        overrideを忘れた場合エラー
クラス定義(2)
class Point(val x :Int, val y :Int) {
  def +(p :Point) = new Point(x+p.x, y+p.x)
  override def toString() = "Point(" + x + ", " + y + ")"
}
val p = new Point(1, 2) + new Point(2, 2)
println(p) // Point(3, 4)
println(p.x, p.y) //(3,4)
      二次元座標上の点を表現するクラス
      クラス名に続けてコンストラクタ引数を定義
          valをつけると外部から読み取り可能
          引数のスコープはクラス定義全体
      演算子は通常のメソッドとして定義
クラス定義(3)
import javax.swing._
class MyFrame extends JFrame("フレーム1") {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  setSize(800, 600)
}
(new MyFrame).setVisible(true)
      extendsに続けてスーパークラスを指定
          Javaと同じ
      スーパークラスのコンストラクタに渡す引数は
       スーパークラス名に続けて記述
      クラス定義中の実行文はインスタンス生成
       時に実行される
trait
trait Foo {
  def foo() :String = "Foo"
}
trait Bar {
  def foo() :String
  def bar() :Unit = println(foo() + "Bar")
}
class FooBar extends Foo with Bar
(new FooBar).bar() // FooBar
       traitに続けて名前と記述
       インスタンスが生成できない一種のクラス
           実装を持つことができる
       多重継承が可能
object
object MyRunnable extends Runnable {
  def run() :Unit = {
    for(i <- 1 to 100) print(i)
  }
}
new Thread(MyRunnable).start // 12guatda.com/cmx.p345...100
     シングルトンオブジェクトを定義可能
         newでインスタンスの生成不可能
     クラスと同様にスーパークラスを指定可能
Implicit Conversion(1)
implicit def int2String(i :Int) :String = i.toString
val n = 54321
println(n.substring(0, 3)) // 543
println(n.endsWith(1)) // true
      implicit defで暗黙の型変換を定義
        Int(引数の型)→ String(返り値の型)

        Int型に存在しないメソッドの呼び出しを検出

       → Stringへの暗黙の変換をコンパイラが試みる
      危険な変換を定義しないようにするのは自己責任
        String → Intなど
Implicit Conversion(2)
class RangeExt(range :Range) {
  def exclude(elem :Int) = range.filter(e => e != elem)
}
implicit def range2RangeExt(r :Range) :RangeExt = new RangeExt(r)
for(i <- 1 to 5 exclude 3) print(i) // 1245
       implicit defで暗黙の型変換を定義
           Range(引数の型)→ RangeExt(返り値の型)
           Rangeにexcludeメソッドが追加されたように見える
       既存のクラスにメソッドを追加(したように見せかけるこ
        とが)可能
パターンマッチング(1)
println(args(0) match {
  case "apple" => "りんご"
  case "grape" => "ぶどう"
  case "peach" => "桃"
  case _       => "その他"
})
      式 match { case パターン => ... }
        switch(式) { case 定数: ... }に相当

        _はdefault相当

      値を返すことができる
      switch文をより強力にしたようなもの
パターンマッチング(2)
println(args match {
  case Array("foo","bar")   =>   "FooBar"
  case Array("bar","foo")   =>   "BarFoo"
  case Array(name)          =>   name
  case _                    =>   "default"
})
      パターンにマッチした値を変数に束縛可能
        1要素の配列について、要素をnameに束縛

      構造を持ったデータをパターンマッチに使える
        コレクションなど
Case Class
abstract class Exp
case class Add(l :Exp, r :Exp) extends Exp
case class Num(v :Int) extends Exp
def eval(exp :Exp) :Int = exp match {
  case Add(l, r) => eval(l) + eval(r)
  case Num(v)    => v
}
println(eval(Add(Num(1), Num(2)))) // 3
      caseをclassの前に付加して定義
      名前(...)でインスタンスが生成可能
      パターンマッチに使える
Structural Typing
object Java { def name() :String = "じゃヴぁ" }
object CSharp { def name() :String = "しーしゃーぷ" }
object Scala { def name(): String = "すから" }
def printName(x :{ def name() :String }) = println(x.name)
printName(Java)      // じゃヴぁ
printName(CSharp)    // しーしゃーぷ
printName(Scala)     // すから
      静的に型チェックされるduck typing
        特定のシグニチャのメソッド(の集まり)を持

         っているかのみがチェックされる
紹介しなかったScalaの機能
   Lazy Value
       遅延評価
   Generics
       Java Genericsと類似しているが、より強力
   Abstract Type
   Existential Type
       Java Genericsのワイルドカードに似たもの
   Extractor
   XML関係の機能
       リテラル
       パターンマッチング
まとめ
   Scalaの言語仕様の概要を駆け足で紹介
       制御構文
       OOP機能
           クラス,object,trait
       関数型の機能
           高階関数,パターンマッチング, case class
       (おそらく)Scalaに特異な機能
           implicit conversion
   是非、Scalaを一度お試しください!

More Related Content

PDF
Scalaで型クラス入門
PDF
Scala の関数型プログラミングを支える技術
PDF
Scala2.8への移行
PDF
ATN No.2 Scala事始め
PDF
BOF1-Scala02.pdf
PDF
実務者のためのかんたんScalaz
PDF
Thinking in Cats
PDF
rpscala35-scala2.9.0
Scalaで型クラス入門
Scala の関数型プログラミングを支える技術
Scala2.8への移行
ATN No.2 Scala事始め
BOF1-Scala02.pdf
実務者のためのかんたんScalaz
Thinking in Cats
rpscala35-scala2.9.0

What's hot (20)

PDF
What Dotty fixes @ Scala関西サミット
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
たのしい関数型
PPT
ジェネリクスの基礎と クラス設計への応用
PPT
Rpscala2011 0601
PDF
Phantom Type in Scala
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
PDF
Scalaで萌える関数型プログラミング[完全版]
PDF
はてなブックマーク in Scala
PDF
たのしい高階関数
PDF
Material
PDF
15分でざっくり分かるScala入門
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
JavaのGenericsとは?
PDF
今から始める Lens/Prism
PDF
Why Reactive Matters #ScalaMatsuri
PDF
Equality in Scala (ScalaMatsuri 2020)
PDF
オブジェクト指向開発におけるObject-Functional Programming
KEY
Algebraic DP: 動的計画法を書きやすく
PDF
Java8 lambdas chapter1_2
What Dotty fixes @ Scala関西サミット
あなたのScalaを爆速にする7つの方法(日本語版)
たのしい関数型
ジェネリクスの基礎と クラス設計への応用
Rpscala2011 0601
Phantom Type in Scala
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
Scalaで萌える関数型プログラミング[完全版]
はてなブックマーク in Scala
たのしい高階関数
Material
15分でざっくり分かるScala入門
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
JavaのGenericsとは?
今から始める Lens/Prism
Why Reactive Matters #ScalaMatsuri
Equality in Scala (ScalaMatsuri 2020)
オブジェクト指向開発におけるObject-Functional Programming
Algebraic DP: 動的計画法を書きやすく
Java8 lambdas chapter1_2
Ad

Viewers also liked (17)

PDF
downey08semaphores.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
TwitterOct2008.pdf
PDF
scalaliftoff2009.pdf
PDF
camel-scala.pdf
PDF
nodalities_issue7.pdf
PDF
downey08semaphores.pdf
PDF
DPLA and What it Means for PA
PDF
DOCX
Mcs 041.1
PDF
program_draft3.pdf
PPSX
Bajar peliculas
PDF
nodalities_issue7.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
downey08semaphores.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
kademlia-1227143905867010-8.pdf
TwitterOct2008.pdf
scalaliftoff2009.pdf
camel-scala.pdf
nodalities_issue7.pdf
downey08semaphores.pdf
DPLA and What it Means for PA
Mcs 041.1
program_draft3.pdf
Bajar peliculas
nodalities_issue7.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Ad

Similar to BOF1-Scala02.pdf (20)

PDF
プログラミング言語Scala
PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
PDF
Scalaプログラミング・マニアックス
PDF
第2回関数型言語勉強会 大阪
PDF
Clojure
PPTX
Xtend の紹介
PPTX
2013-12-08 西区プログラム勉強会
PDF
Introduction Xtend
PPTX
PPTX
2018/2/20 Kotlin勉強会
PDF
Essential Scala 第5章 シーケンス処理
PDF
JavaWorld Day 2009 Scala
PDF
F#入門 ~関数プログラミングとは何か~
KEY
Beginners Scala in FAN 20121009
PDF
Object-Funcational Analysis and design
ODP
Vim scriptとJavaとHaskell
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
PPTX
ゼロから始めるScala文法 (再)
PPT
G*workshop sendai 20100424(v2)
PDF
早稲田大学授業 - Java Programing上級
プログラミング言語Scala
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Scalaプログラミング・マニアックス
第2回関数型言語勉強会 大阪
Clojure
Xtend の紹介
2013-12-08 西区プログラム勉強会
Introduction Xtend
2018/2/20 Kotlin勉強会
Essential Scala 第5章 シーケンス処理
JavaWorld Day 2009 Scala
F#入門 ~関数プログラミングとは何か~
Beginners Scala in FAN 20121009
Object-Funcational Analysis and design
Vim scriptとJavaとHaskell
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
ゼロから始めるScala文法 (再)
G*workshop sendai 20100424(v2)
早稲田大学授業 - Java Programing上級

More from Hiroshi Ono (18)

PDF
Voltdb - wikipedia
PPT
Gamecenter概説
PDF
EventDrivenArchitecture
PDF
program_draft3.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
SACSIS2009_TCP.pdf
PDF
program_draft3.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
BOF1-Scala02.pdf
PDF
TwitterOct2008.pdf
PDF
pamphlet_honsyou.pdf
PDF
camel-scala.pdf
PDF
program_draft3.pdf
PDF
nodalities_issue7.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Voltdb - wikipedia
Gamecenter概説
EventDrivenArchitecture
program_draft3.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
SACSIS2009_TCP.pdf
program_draft3.pdf
kademlia-1227143905867010-8.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
BOF1-Scala02.pdf
TwitterOct2008.pdf
pamphlet_honsyou.pdf
camel-scala.pdf
program_draft3.pdf
nodalities_issue7.pdf
genpaxospublic-090703114743-phpapp01.pdf
kademlia-1227143905867010-8.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf

BOF1-Scala02.pdf

  • 1. Scalaミニチュートリアル ~Introduction to Scala~ 筑波大学大学院システム情報工学研究科 水島 宏太
  • 3. Scala?  最近話題の言語  Matzにっき など  Actorライブラリなどで注目を集めている  ポストJava?  静的型付けオブジェクト指向関数型言語  作者:Martin Odersky  JavaへのGenerics導入の貢献者の一人  JVM上で動作する処理系  近代的な言語仕様
  • 4. 関数型言語?  明確な定義は無い  副作用無しのスタイルを積極的にサポート?  OOPと同じくらい曖昧  具体例  純粋:Haskell  非純粋:Scala,SML,OCaml,Scheme,...  関数型ではない:C,C++,Java,C#,Ruby,...
  • 5. hello, world object HelloWorld { def main(args :Array[String]) :Unit = { println("hello, world") } }  objectでシングルトンオブジェクトを定義(後述)  defでメソッド定義  Array[String] ≒ String[]  Unit ≒ void  以降、mainの定義は省略
  • 6. 変数の宣言(varとval) var x = 1 // ≒ var x :Int = 1 var y = 2 // ≒ var y :Int = 2 val z = x + y // ≒ val z :Int = x + y println(z)  varで変数(変更可能)を宣言  Javaの通常の変数と同じ  変数の型は省略可能(右辺の型から推論される)  valで変数(変更不能)を宣言  Javaのfinalな変数  変数の型は省略可能
  • 7. 条件分岐(if) val num = args(0).toInt println( if(num % 2 == 0) "偶数" else "奇数" )  Javaのifに類似  elseを書くと値を返すことができる  Javaの?:演算子と同じようにも使える  elseを書かない場合Unit型の値が返る
  • 8. forによる繰り返し(1) var sum = 0 for(arg <- args) sum += arg.toInt println(sum)  コマンドライン引数の合計値を計算するプロ グラム  forでコレクションの要素について繰り返し  Javaの拡張for文に類似  実際には拡張for文よりも強力  argの型は省略可能(推論される)
  • 9. forによる繰り返し(2) for(i <- 1 to 100) { println(if(i%15 == 0) "FizzBuzz" else if(i%3 == 0) "Fizz" else if(i%5 == 0) "Buzz" else i.toString) }  Fizz Buzzプログラム  x to yでxからyまでのRangeを生成  x.to(y)と同じ意味(.や()などを省略可能)  ifが値を返す  elseを省略した場合は、Unit型の値を返す  整数もオブジェクト → メソッドが呼び出せる
  • 10. whileによる繰り返し var sum = 0 var i = 0 while(i < args.length) { sum += args(i).toInt i += 1 } println(sum)  コマンドライン引数の合計値を計算  forよりも冗長だが、forよりも高速  性能をチューニングしたいときに使う
  • 11. 高階関数(1) println(args.foldLeft(0)((sum, n) => sum+n.toInt))  コマンドライン引数の合計値を計算するプロ グラム  (x,...) => ...で無名関数を定義  Javaの無名クラスのようなもの  無名関数の引数の型が推論可能なときは省略可能  foldLeft: 関数を引数に取るメソッド(高階関数)  ...f(f(f(0, args(0)), args(1)), args(2))...  関数型言語でループを書くための一般的な方法
  • 12. 高階関数(2) println((0/:args)(_+_.toInt))  コマンドライン引数の合計値を計算するプロ グラム  /: ≒ foldLeft  末尾に:の付いた演算子は左右逆に適用  (x /: y)(z) → y./:(x)(z)  _+_.toInt ≒ (x, y) => x+y.toInt  式に「穴を開けた」無名関数を定義
  • 13. 高階関数(3) import java.io._ def open(path :String)(block :InputStream => Unit) { val in = new FileInputStream(path) try { block(in) } finally { in.close; println("closed") } } open("hoge.txt"){in => () } // inは自動的にcloseされる  リソースが自動的にcloseされるopen  X => Y:「Xを受け取ってYを返す関数」の型  InputStream => Unit 「InputStreamを受け取り何も返さない関数」  引数無しメソッドの呼び出しの()は省略可能
  • 14. クラス定義(1) class HelloWorld { def display() :Unit = println(toString()) override def toString() = "hello, world" } (new HelloWorld).display // hello, world  classに続けてクラス名を記述  Javaとほぼ同じ  返り値の型は省略可能(推論される)  overrideでメソッドをオーバーライド  Javaの@Overrideアノテーションと同じ  overrideを忘れた場合エラー
  • 15. クラス定義(2) class Point(val x :Int, val y :Int) { def +(p :Point) = new Point(x+p.x, y+p.x) override def toString() = "Point(" + x + ", " + y + ")" } val p = new Point(1, 2) + new Point(2, 2) println(p) // Point(3, 4) println(p.x, p.y) //(3,4)  二次元座標上の点を表現するクラス  クラス名に続けてコンストラクタ引数を定義  valをつけると外部から読み取り可能  引数のスコープはクラス定義全体  演算子は通常のメソッドとして定義
  • 16. クラス定義(3) import javax.swing._ class MyFrame extends JFrame("フレーム1") { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) setSize(800, 600) } (new MyFrame).setVisible(true)  extendsに続けてスーパークラスを指定  Javaと同じ  スーパークラスのコンストラクタに渡す引数は スーパークラス名に続けて記述  クラス定義中の実行文はインスタンス生成 時に実行される
  • 17. trait trait Foo { def foo() :String = "Foo" } trait Bar { def foo() :String def bar() :Unit = println(foo() + "Bar") } class FooBar extends Foo with Bar (new FooBar).bar() // FooBar  traitに続けて名前と記述  インスタンスが生成できない一種のクラス  実装を持つことができる  多重継承が可能
  • 18. object object MyRunnable extends Runnable { def run() :Unit = { for(i <- 1 to 100) print(i) } } new Thread(MyRunnable).start // 12guatda.com/cmx.p345...100  シングルトンオブジェクトを定義可能  newでインスタンスの生成不可能  クラスと同様にスーパークラスを指定可能
  • 19. Implicit Conversion(1) implicit def int2String(i :Int) :String = i.toString val n = 54321 println(n.substring(0, 3)) // 543 println(n.endsWith(1)) // true  implicit defで暗黙の型変換を定義  Int(引数の型)→ String(返り値の型)  Int型に存在しないメソッドの呼び出しを検出 → Stringへの暗黙の変換をコンパイラが試みる  危険な変換を定義しないようにするのは自己責任  String → Intなど
  • 20. Implicit Conversion(2) class RangeExt(range :Range) { def exclude(elem :Int) = range.filter(e => e != elem) } implicit def range2RangeExt(r :Range) :RangeExt = new RangeExt(r) for(i <- 1 to 5 exclude 3) print(i) // 1245  implicit defで暗黙の型変換を定義  Range(引数の型)→ RangeExt(返り値の型)  Rangeにexcludeメソッドが追加されたように見える  既存のクラスにメソッドを追加(したように見せかけるこ とが)可能
  • 21. パターンマッチング(1) println(args(0) match { case "apple" => "りんご" case "grape" => "ぶどう" case "peach" => "桃" case _ => "その他" })  式 match { case パターン => ... }  switch(式) { case 定数: ... }に相当  _はdefault相当  値を返すことができる  switch文をより強力にしたようなもの
  • 22. パターンマッチング(2) println(args match { case Array("foo","bar") => "FooBar" case Array("bar","foo") => "BarFoo" case Array(name) => name case _ => "default" })  パターンにマッチした値を変数に束縛可能  1要素の配列について、要素をnameに束縛  構造を持ったデータをパターンマッチに使える  コレクションなど
  • 23. Case Class abstract class Exp case class Add(l :Exp, r :Exp) extends Exp case class Num(v :Int) extends Exp def eval(exp :Exp) :Int = exp match { case Add(l, r) => eval(l) + eval(r) case Num(v) => v } println(eval(Add(Num(1), Num(2)))) // 3  caseをclassの前に付加して定義  名前(...)でインスタンスが生成可能  パターンマッチに使える
  • 24. Structural Typing object Java { def name() :String = "じゃヴぁ" } object CSharp { def name() :String = "しーしゃーぷ" } object Scala { def name(): String = "すから" } def printName(x :{ def name() :String }) = println(x.name) printName(Java) // じゃヴぁ printName(CSharp) // しーしゃーぷ printName(Scala) // すから  静的に型チェックされるduck typing  特定のシグニチャのメソッド(の集まり)を持 っているかのみがチェックされる
  • 25. 紹介しなかったScalaの機能  Lazy Value  遅延評価  Generics  Java Genericsと類似しているが、より強力  Abstract Type  Existential Type  Java Genericsのワイルドカードに似たもの  Extractor  XML関係の機能  リテラル  パターンマッチング
  • 26. まとめ  Scalaの言語仕様の概要を駆け足で紹介  制御構文  OOP機能  クラス,object,trait  関数型の機能  高階関数,パターンマッチング, case class  (おそらく)Scalaに特異な機能  implicit conversion  是非、Scalaを一度お試しください!