ログイン
編集不可のページディスカッション情報添付ファイル

2013-03-08 07:51:03時点のリビジョン3

メッセージを消す
alstamber/Scala

MMA

なにこれ

とりあえず触ってみる

   1 scala> 1+1
   2 res0: Int = 2

   1 scala> res0 * 5
   2 res1: Int = 10

   1 scala> println("Hello, world!")
   2 Hello, world!

変数の定義

   1 scala> val msg = "Hello, world!"
   2 msg: String = Hello, world!

   1 scala> val msg2:String = "Hello, world!"
   2 msg2: String = Hello, world!

varとval

   1 scala> val msg = "Hello, world!!"
   2 <console>:8: error: reassignment to val
   3        msg = "Hello, World!!"

関数定義

   1 def 関数名(引数名:引数型, 引数名:引数型, ...):戻り値型 = 関数の式

   1 def hello(name:String):String = {
   2   return "Hello! " + name
   3 }

   1 def hello(name:String):String = {
   2   "Hello! " + name
   3 }

   1 def hello(name:String) = {
   2   "Hello! " + name
   3 }

   1 def hello(name:String) = "Hello! " + name

単独で動くプログラムをつくってみる

   1 object hoge
   2   def main(args:Array[String]) = {
   3     //メインの処理
   4   }
   5 }

scalac hoge.scala

scala hoge

Scalaらしいループ

   1 var i = 0
   2 while(i < args.length) {
   3   println(args(i))
   4   i += 1
   5 }

   1 args.foreach((arg:String) => println(arg))

   1 args.foreach(arg => println(arg))

配列

配列の生成

   1 val hoge = Array[String](3)

配列への代入と参照

   1 hoge(2) = "kyoko"
   2 println(hoge(2))

便利な配列の生成方法

   1 val hoge = Array("Akari", "Kyoko", "Yui", "Chinatsu")

リスト

リストの生成

   1 val hoge = List(2, 3, 5, 7)

リストの結合

   1 val hoge = List(2, 3)
   2 val fuga = List(5, 7)
   3 val piyo = hoge ::: fuga

リストの先頭に要素を追加

   1 val hoge = List(3, 5, 7)
   2 val fuga = 2 :: hoge

   1 hoge.::(2)

タプル

タプルを作る

   1 val hoge = (1, "Kyoko", 2, "Akari")

タプルを使う

   1 println(hoge._2)  // Kyoko と表示される
   2 

クラス

   1 class Hoge {
   2   var hoge = 1 //フィールド
   3   var fuga = 3 //フィールド
   4 
   5   def myMultiple() = hoge * fuga //メソッド
   6 }

   1 val a = new Hoge()

   1 a.hoge = 2  // OK
   2 

メソッド

   1 private def hello() = "Hello, World!"

シングルトンオブジェクト

シングルトンオブジェクトの定義

   1 object Hoge {
   2   // あーだこーだ
   3 

シングルトンオブジェクトの性質

コンパニオンクラスとコンパニオンオブジェクト

コンパニオンオブジェクトの例

基本型

基本リテラル

整数リテラル

浮動小数点リテラル

文字リテラル

文字列リテラル

シンボルリテラル

   1 `hoge //hogeのシンボルリテラル
   2 

   1 val hoge = "hoge"
   2 val hoge2 = "hoge" //hogeとhoge2は違うオブジェクトになっている
   3 
   4 val fuga = `fuga
   5 val fuga2 = `fuga //fugaとfuga2は同じオブジェクト
   6 

Booleanリテラル

演算子

   1 1 + 2
   2 (1).+(2)  // この2つは同じ意味
   3 

比較演算子について

   1 "hoge" == "hoge" //左と右の文字列は同じオブジェクトかも知れないし違うオブジェクトかもしれないから、TrueかもしれないしFalseかもしれない
   2 

   1 "hoge" == "hoge" //かならずTrue
   2 

演算子の優先順位について

リッチラッパー

   1 0 min 5 // min演算子で計算されて結果が0になる
   2 

制御構造

if式

   1 if (条件式) {
   2   //真の時の式
   3 }else{
   4   //偽の時の式
   5 }

   1 val hoge = "hoge"
   2 println(if (!hoge.isempty) hoge else "default")

while式, do-while式

   1 var a = x
   2 var b = y
   3 while(a != 0){
   4   val temp = a
   5   a = b % a
   6   b = temp
   7 }

for式

for式の基本的な使い方

   1 val yuruyuri = List("Kyoko", "Akari", "Yui", "Chinatsu")
   2 for(member <- yuruyuri){
   3   println(member)
   4 }

Range

   1 for(i <- 1 to 10) println(i) //(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)という数列が生成される
   2 for(i <- 1 until 10) println(i) //(1, 2, 3, 4, 5, 6, 7, 8, 9)という数列が生成される
   3 

フィルタリング

   1 val yuruyuri = List("Kyoko", "Akari", "Yui", "Chinatsu")
   2 for(member <- yuruyuri if member.endsWith("i")){
   3   println(member)
   4 }

入れ子のfor式

   1 for(i <- 1 to 9; j <- 1 to 9) println(i*j)

yield

   1 val hoge = for (i <- 0 to 5) yield i+1

try-catch-finally

   1 try{
   2   //例外が発生しそうな処理を書く
   3 }catch{
   4     case e: 例外名  => 例外処理
   5 }

match式

   1 val yuruyuri = "kyoko"
   2 yuruyuri match {
   3   case "kyoko" => println("so cute")
   4   case "akari" => println("who is she?")
   5   case _ => println("so so") // _ はdefaultに相当
   6 }

   1 val yuruyuri = "kyoko"
   2 val result = yuruyuri match {
   3   case "kyoko" => "so cute"
   4   case "akari" => "who is she?"
   5   case _ => "so so"
   6 }
   7 println(result)

ローカル関数

   1 def calc(a:Int, b:Int) = {
   2   def add() = a + b
   3   def sub() = a - b
   4   (add, sub)
   5 }

関数リテラル

   1 arg => println(arg)

第一級オブジェクトとしての関数リテラル

   1 val hoge = (x:Int) => x+1
   2 println(hoge(10))

プレースホルダー

   1 val yuruyuri = List("Kyoko", "Akari", "Yui", "Chinatsu")
   2 yuruyuri.foreach(println(_))
   3 // yuruyuri.foreach(x => println(x))と同じ
   4 

   1 val myadd = _ + _ //エラーが出る
   2 

   1 val myadd = (_:Int) + (_:Int)
   2 println(myadd(2, 3))

部分適用

   1 def sum(a:Int, b:Int, c:Int) = a + b + c
   2 val sum2 = sum(_:Int, 3, _:Int)

   1 println(sum2(2, 4)) //9が出力される
   2 

   1 def sum(a:Int, b:Int, c:Int) = a + b + c
   2 val sum2 = sum _

部分適用の内部的動作

   1 def sum(a:Int, b:Int) = a + b
   2 val sum2 = sum _

   1 sum2(2, 3)

アンダースコアの省略

   1 val yuruyuri = List("Kyoko", "Akari", "Yui", "Chinatsu")
   2 yuruyuri.foreach(println)
   3 // foreachメソッドの引数には呼び出す関数を必ず記述しなければならないため、println(_)のアンダースコアは省略できる
   4 

クロージャ

束縛変数と自由変数

高階関数

カリー化

名前渡しパラメータ