Programming in Scalaを読み始めた Chapter4

Chapter4はクラスとオブジェクト。難しくなってきた。。。

アクセス修飾子なにもつけないとpublic
objectキーワートでsingleton。newできない。

$ ls
ChecksumAccumulator.scala Summer.scala
$ cat ChecksumAccumulator.scala 
import scala.collection.mutable.Map

object ChecksumAccumulator {
  
  private val cache = Map[String, Int]()
  
  def calculate(s: String): Int =
    if(cache.contains(s))
      cache(s)
    else {
      val acc = new ChecksumAccumulator
      for(c <- s)
        acc.add(c.toByte)
      val cs = acc.checksum()
      cache += (s -> cs)
      cs
    }
}

class ChecksumAccumulator {
  private var sum = 0
  def add(b: Byte) { sum += b }
  def checksum(): Int = ~(sum & 0xFF) + 1
}


$ cat Summer.scala 
import ChecksumAccumulator.calculate

object Summer {
  def main(args : Array[String]) : Unit = {
    for(arg <- args)
      println(arg + ": " + calculate(arg))
  }
}
$ scalac ChecksumAccumulator.scala Summer.scala 
$ ls
ChecksumAccumulator$$anonfun$calculate$1.class
ChecksumAccumulator$.class
ChecksumAccumulator.class
ChecksumAccumulator.scala
Summer$$anonfun$main$1.class
Summer$.class
Summer.class
Summer.scala
$ scala Summer of love
of: -213
love: -182

trait版。mainメソッドなくてもOK。ただしコマンドライン引数が取れない。

$ cat FallWinterSpringSummer.scala 
import ChecksumAccumulator.calculate

object FallWinterSpringSummer extends Application {

   for (season <- List("fall", "winter", "spring"))
    println(season + ": " + calculate(season))
}
$ scalac FallWinterSpringSummer.scala 
$ ls
ChecksumAccumulator$$anonfun$calculate$1.class
ChecksumAccumulator$.class
ChecksumAccumulator.class
ChecksumAccumulator.scala
FallWinterSpringSummer$$anonfun$1.class
FallWinterSpringSummer$.class
FallWinterSpringSummer.class
FallWinterSpringSummer.scala
Summer$$anonfun$main$1.class
Summer$.class
Summer.class
Summer.scala
$ scala FallWinterSpringSummer
fall: -159
winter: -153
spring: -147