サンプル書いて理解し続ける
オライリー英語本が何故かAndroidに入ってる。理由は、英語版しか電子書籍が売ってなかったから。
まぁいいよ。言語見ればわかるだろと。
shapes.scala をざくっと書いている。
package shapes { class Point(val x:Double, val y:Double) { override def toString() = "Point(" + x + ", " + y + ")" } abstract class Shape() { def draw(): Unit } class Circle (val center:Point, val radius:Double) extends Shape { def draw() = println("Circle.draw: " + this) override def toString() = "Circle(" + center + ", " + radius + ")" } class Rectangle (val lowerLeft:Point, val height:Double, val width:Double) extends Shape { def draw() = println("Rectangle.draw: " + this) override def toString() = "Rectangle(" + lowerLeft + ", " + height + ", " + width + ")" } class Triangle(val point1:Point, val point2:Point, val point3:Point) extends Shape { def draw() = println("Triangle.draw: " + this) override def toString() = "Triangle" + point1 + ", " + point2 + ", " + point3 + ")" } }
toString があるってことはデフォルトの基底は Object かそれっぽい何かという予測。クラス定義で引数取ってるけど、仕様的には NOOP 言語に近いのか?GO は弄ったこと無いからわからんけど。多分そっちに意味合いが近そうだ。
これ、クラスコンストラクタでパターンマッチとかねえのかな?
abstract あるってことはガチObject指向できるのね。
改行スペースも基本は意味を成さないか。文法的にはJavaを随分踏襲してる。
package shapes { import scala.actors._ import scala.actors.Actor._ object ShapeDrawActor extends Actor { def act() { loop { receive { case s: Shape => s.draw() case "exit" => println("exit now."); exit case x: Any => println("Undefined message.") } } } } }
サンプルなので書いてみたが、Actor って何者だ。
まぁ、イベントかメッセージ待機に入るクラスなのは分かった。継承できるってことは、object 指定はシングルトンな実装説濃厚。
そしてコンパイル。
C:\...>scalac shapes.scala shapes-actor.scala
ちょwwwww shapes ディレクトリに class ふぁいるががががが、、、、。
Javaからシームレスに呼べるとか嘘偽りなさそうな、、、、。
ほげっと実行
import shapes._ ShapeDrawActor.start() ShapeDrawActor ! new Circle(new Point(0.0, 0.0), 1.0) ShapeDrawActor ! "exit"
case はパターンマッチのつもりなんだろうか、、、、いやむしろメッセージ式だといいんだが、、、。
今の時点ではなんとも不明。
C:\...>scala -cp . script4.scala Circle.draw: Circle(Point(0.0, 0.0), 1.0) exit now.
でも、メッセージ式なら夢がひろがりんぐ。