Scala雑記#1

環境

sbtがよしなにやってくれる

$ brew install sbt

$ sbt console

変数宣言

val <変数名> = <中身>

val <変数名>: <型> = <中身>

Hello, World

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello, World!")
  }
}

if

if (条件式) { 
  do 
} else {
  do
}

while

while( n <= 5 ){
  println("hoge")
  i += 1
}

for

for(x <- 1 to 5; y <- 1 until 5 ) {
  println(x, y)
}

こうすると

x = 1 y = 1
x = 1 y = 2
x = 1 y = 3
x = 1 y = 4
x = 2 y = 1
x = 2 y = 2
x = 2 y = 3
x = 2 y = 4
x = 3 y = 1
x = 3 y = 2
x = 3 y = 3
x = 3 y = 4
x = 4 y = 1
x = 4 y = 2
x = 4 y = 3
x = 4 y = 4
x = 5 y = 1
x = 5 y = 2
x = 5 y = 3
x = 5 y = 4

こうなる。便利。

match

<対象> match {
  case <パターン> (if式) => <式>
  case <パターン> (if式) => <式>
}
val hoge = "hoge"

hoge match  {
  case "hoge" => "HOGE"
  case "huga" => "HUGA"
  case _ => "other"
}

一番したのはワイルドカード、defaultとかに相当すると思って良さげ

val lst = List("A", "B", "C")

lst match {
  case List("A", b , c) => println(b, c)
  case _ => println("nothing")
}

こんな感じ

val lst = List("A", "B", "C")

lst match {
  case List("A", b , c) if b != "B" => println(b, c)
  case _ => println("nothing")
}

パターンマッチに対してifガードもかける。

val lst = List("A", "B", "C")

lst match {
  case "A" :: b :: c :: _ =>
    println("b = " + b)
    println("c = " + c)
  case _ => println("nothing")
}

こうもかける。 :: (中間パターン)でパターンマッチを行なった際、リスト末尾の無視のために _ の挿入が必要。

case v:java.lang.Integer よろしく型でのパターンマッチもできるよ。

class

class Point(val x: Int, val y: Int)
def <メソッド名> (引数名: 型)*: <返り値の型> = <式>
class Adder {
  def add(x: Int, y: Int): Int = x + y
}

簡単なのだとこんなの

class Hoge() extends Huga {
}

で継承もできる。overrideも同様。

基礎基礎文法だけだけど、今日はとりあえずここまで...