Scala 例 クラスの書き方など基本
Scalaは、オブジェクト指向+関数型言語とのことなので、基本の半分は、オブジェクト指向のはず。
とりあえず、「Javaのあれは、Scalaのこれ」というのが知りたいな。
classとtrait(それにobjectとtypeもある)
Javaでは
- class
- interface
というものがあった。
Scalaでは、
- class
- trait
- object
- type
がある。
特に、Scalaでは関数もオブジェクト扱いできて、関数は、
def=>やscala.Function1など
で定義する。
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と変わらなさそうところから確認できればいいや。