« A Scala Tutorial for Java programmers を淡々と写経するよ (2) | メイン | JavaとCの実行速度 »

A Scala Tutorial for Java programmers を淡々と写経するよ (3)

前回からの続きで、淡々と進めていきましょう。

4 Everything is an object

本文によると、Scalaは全てがオブジェクトという意味で、純粋オブジェクト指向言語なんだそうです。

4.1 Numbers are objects

object NumbersAreObject {
  def main(args: Array[String]) {
    var x = 2
    println( 1 + 2 * 3 / x )
    println( 1.+(2.*(3./(x))) )
  }
}

コンパイルして実行してみます。

% scala NumbersAreObject
4
4.0

うーん、どっかで暗黙の型変換がおこっているようです。これは将来の疑問として残しておきましょう。

4.2 Functions are objects

Scalaでは関数もオブジェクトです。これは、ちょっと嬉しい仕様ですね。早速、写経してみましょう。

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

oncePerSecondメソッドにtimeFiles関数オブジェクトを渡しています。このとき、timesFilesに()がついていないことに気付きます。さらに、oncePerSecondメソッドの引数は () => unit という型が指定されています。()は引数の無い関数という意味で、=> unitは値を返さない関数を示しているそうです。

コンパイルして実行してみましょう。

$ scala Timer
time files like an arrow...
time files like an arrow...
time files like an arrow...
time files like an arrow...
^C

4.2.1 Anonymous functions

無名関数の定義もできるようです。

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

トラックバック

このエントリーのトラックバックURL:
http://recompile.net/apps/mt-tb.cgi/153

コメント (2)

みずしま:

遅いレスですが、

> どっかで暗黙の型変換がおこっているようです。

は1.が浮動小数点数リテラルとして扱われている
ためです。(1).のように括弧で括ると整数に
対するメソッド呼び出しになります。

takai:

おお。ちょっとマニアックすぎますね。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年7月 4日 10:58に投稿されたエントリーのページです。

ひとつ前の投稿は「A Scala Tutorial for Java programmers を淡々と写経するよ (2)」です。

次の投稿は「JavaとCの実行速度」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。