読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

サンプル書いて理解し続ける

勉強 Scala 日記

オライリー英語本が何故か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.

でも、メッセージ式なら夢がひろがりんぐ。