SaclaTutorial.pdf を読みなおす (3)

A Scala Tutorial for Java programmers (pdf) について。

4 Everything is an object に書いてあること

これも、まぁ表題通り。そういえばここで、in the sense that という熟語を覚えたんだった。

Scala is a pure object-oriented language in the sense that everything is an object, including numbers or functions.

数値や関数を含むすべてがオブジェクトであるという意味において、Scalaオブジェクト指向言語です。

この文章にあるように、ここでは特に数値と関数について書かれている。ひとつめの例は数値についてで、数値もオブジェクトなので、メソッドを持っていますよ、という話。

1 + 2 * 3 / x

これは以下と等価。

1.+(2.*(3./(x)))

これは、3 Interaction with Java の最後にあった、単一の引数をとるメソッドは中置記法で使用されることができますよ、という話と同じ話ですね (あ、よく見たら as we saw in the previous section て書いてる)。

最初に読んだときも思ったんだけど、これって優先順位とかどうなるんだろ? なんかメソッド名の最初の一文字で優先順位その他が決まる、みたいなことをどっかで読んだような気もするんだけど、…あれ、それは OCaml の話だったかな?

多分、An Overview of the Scala Programming Language (pdf) のどこかに書いてたと思う…。

で、次の例では、関数もオブジェクトですよ、ということが書いてある。オブジェクトなので、関数に引数として渡すこともできるし、変数に格納することもできるし、返り値として返すこともできる。以下がサンプルコードで、oncePerSecond メソッドは引数として渡される callback を 1 秒ごとに呼び出す。プログラムの実行結果としては 1 秒ごとに "time flies like an arrow..." を表示する (ヤなプログラムだ)。callback の型は () => unit で、これは引数をとらず、返り値も返さない関数の型。

object Timer {
  def oncePerSecond(callback: () => unit) {
    while (true) { callback(); Thread sleep 1000 }
  }
  def timeFlies() {
    println("time flies like an arrow...")
  }
  def main(args: Array[String]) {
    oncePerSecond(timeFlies)
  }
}

最後の例は上の例の修正版で、無名関数の書き方を示す。

object TimerAnonymous {
  def oncePerSecond(callback: () => unit) {
    while (true) { callback(); Thread sleep 1000 }
  }
  def main(args: Array[String]) {
    oncePerSecond(() =>
      println("time flies like an arrow..."))
  }
}