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

| | コメント(2)

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

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..."))
  }
}

コメント(2)

みずしま :

遅いレスですが、

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

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

takai :

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

コメントする

著者について

高井直人
高井 直人
takai@recompile.net

ソフトウェアエンジニア。1977年横浜生まれ。大学在学中からネットワークや情報技術にたずさわる。Web制作会社などを経て、現在はシステムインテグレータに勤務。エンタープライズRubyをテーマに社内標準の策定などに従事している。

タグクラウド

ウェブページ

Powered by Movable Type 4.1-en-release-26-r1141-20080104