Scala 例 クラスの書き方など基本

Scalaは、オブジェクト指向関数型言語とのことなので、基本の半分は、オブジェクト指向のはず。
とりあえず、「Javaのあれは、Scalaのこれ」というのが知りたいな。

classとtrait(それにobjectとtypeもある)

Javaでは

  • class
  • interface

というものがあった。

Scalaでは、

  • class
  • trait
  • object
  • type

がある。
特に、Scalaでは関数もオブジェクト扱いできて、関数は、

で定義する。

Person.scalaファイルを以下のような内容で作成保存する。

//Javaとはクラスの書き方がちょっとちがう
//クラスの宣言と同時にいきなりコンストラクタがくる
//コンストラクタの引数は、フィールドに設定しなくても
//クラス内でつかえる。
//StringとIntがJavaのなににあたるんだろう。
//なんとなくつかえてしまうんだが、気にしないでいこう。
class SimplePerson(name: String, age: Int) {
	
	//なにげにjava.lang.Stringのformatではない。
    def introduce = println("I am %s. %s years old.".format(name, age))

}

val sp = new SimplePerson("Foo", 10)
sp.introduce
//これはerror
//println(p.name)

//JavaのinterfaceはScalaにはない。
//Scalaでは、traitがある。
//traitは実装もできるinterface
//複数継承することもできる。
trait Thing {
    def change(): Thing
}

//valとvarをつけた
//valであれば、getterが
//varであれば、getterとsetterが
//できる。
class SimpleThing(val name: String, var content: String)
extends Thing {

    //コンストラクタを追加で定義
    def this(name: String) = this(name, "")

    override def change() = new SimpleThing("New " + name, content)
}
 val st = new SimpleThing("Programming", "A way to use computers")
//errorにならない
//valとvarをつけるとアクセスできるようになる。
println(st.name)
println(st.content)
//これはerrorになる。valだから。
//st.name = "Programming!"
//varは変更できる
st.content = "An art"
println(st.content)
println(st.change.name)


class OrdinaryPerson(name: String, age: Int) {

   //ScalaのListを使ってみる。java.util.Listじゃありません。
   //Scalaでは、コンパニオンオブジェクトを定義すれば、newをつけずにコンストラクタを実行できる。
   private var favorites = List[SimpleThing]()
     
   def comeToLove(favorite: SimpleThing) = favorites :+= favorite
   
   //決まりきった、リストのループ処理を記述しなくていける。
   def showFavorites = favorites.foreach { 
       //Scalaで関数リテラルとよばれているもの
       (thing) => println("%s loves %s.".format(name, thing.name))
   }
}

val op = new OrdinaryPerson("Bar", 10)
op.comeToLove(new SimpleThing("Programming"))
op.comeToLove(new SimpleThing("Chocolate"))
op.showFavorites

class ComplexThing(name: String, contents: List[Thing])
extends Thing {
    
    override def change() = new ComplexThing("More complex" + name, contents
}

実行してみると、


$ scala Person.scala
I am Foo. 10 years old.
Programming
A way to use computers
An art
New Programming
Bar loves Programming.
Bar loves Chocolate.

Javaとあんまりかわんないじゃん!」という気がしてきた。Scalaの良いところにたどりつきたいけど、まずは、入りやすさを重視して、Javaと変わらなさそうところから確認できればいいや。