前回からの続きで、淡々と進めていきましょう。
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).のように括弧で括ると整数に
対するメソッド呼び出しになります。
投稿者: みずしま | 2007年8月10日 08:55
日時: 2007年8月10日 08:55
おお。ちょっとマニアックすぎますね。
投稿者: takai | 2007年8月10日 10:00
日時: 2007年8月10日 10:00