Scala Primer
Scalaのオブジェクト
- シングルトンクラス = Scala のオブジェクト。
- インスタンスのように複数作成はできない。
#コンパイル
scalac HelloWorld.scala
scala HelloWorld
scalac -d classes HelloWorld.scala
scala -cp classes HelloWorld
for構文
- ジェネレータを用いる(eachのようなもの?)
for (n:Int <- Range(1,101))
total += n
- for条件にフィルタをかけることができる
for (n:Int <- Range(1,101); if (n % 2 == 0))
total += n
メソッドと関数
- Java同様にメソッドが存在する
object HelloWorld {
def main(args: Array[String]) = {
println("Hello World")
}
def pritest(s: String) = {
println(s)
}
}
- App trait を使うと main メソッドを省略できる
- ただ、よくわからないのが実行方法によって結果が違うこと。
- おそらく mainメソッドの実行方法が違うのだと思うけど詳しく調べられていない。
object HelloWorld extends App {
println("Hello World")
}
> scala HelloWorld.scala
実行結果では何も表示されない
> scalac HelloWorld.scala
> scala HelloWorld
printlnの結果が表示される
object HelloWorld extends App {
println("Hello World")
}
HelloApp.main(null)
> scala HelloWorld.scala
printlnの結果が表示される
- 関数オブジェクト(メソッドの中で関数定義が可能)
object HelloWorld {
def main(args: Array[String]) = {
println("Hello World")
val pritest = (s: String) => {
println(s)
}
}
}
- 引数の名前指定
def func (a:Int, b:Int)
func(b=1, a=2)
- メソッドを関数オブジェクトとして取り出す
object HelloWorld {
def main(args: Array[String]) = {
val func = pritest _
func(1)
}
def pritest(num: Int) = {
println(num)
}
}
カリー化
object HelloWorld {
def main(args: Array[String]) = {
val pritest = preTest(1)
pritest(10)
}
def preTest(min: Int) = (max: Int) => {
for(n:Int <- Range(min, max + 1))
println(n)
}
}