Javaのクラスを使う/すべてはオブジェクト
beginner's guideの「3 Interaction with Java」と「4 Everything is an object」を読みました。
Javaのクラスを使う
ScalaはJavaVMの上で動くので、Javaのクラスが利用できます。使い方も簡単で、importすれば後は普通に使えます。
- java.langパッケージはデフォルトでインポートされています。
- importもJavaのモノより拡張されていて↓みたいな書き方ができます。
- Javaのstatic importみたいなことも可能です。
import java.net.{URI,URL} // java.net.URI, java.net.URLをインポート import java.util._ // java.util以下のパッケージをすべてインポート import java.util.Calendar._ // CalendarのAPIをすべてstaticインポート(staticは不要) object ImportSample { def main(args: Array[String]) { var url = new URL("http://foo.com") println(url) var uri = new URI("http://var.com") println(uri) var date = new Date println(date) var now = getInstance() // static importしたCalendar.getInstance()を実行 println(now.get( YEAR )) // 定数「YEAR」は Calendarからstaticインポートされている。 println( Integer.valueOf(1) ) // java.lang配下のクラスはデフォルトでインポートされている。 } }
実行結果です。
http://foo.com http://var.com Wed Apr 23 18:46:26 JST 2008 2008 1
すべてはオブジェクト
Scalaでは、整数や関数を含むすべてがオブジェクトらしい。
- オブジェクトなので、整数リテラルのメソッドを呼び出すことができます。(Rubyのように。)
- オブジェクトなので、関数をメソッドの引数として渡すことができます。(JavaScriptのように。)
- 無名関数も使えます。
object EveryThingObjectSample { def main(args: Array[String]) { // 整数がオブジェクトなのでこんなことができる。 // Rubyっぽいな println(100.toString) println(100.equals(100)) // 関数もオブジェクト。 run(foo) // 自身の関数fooを引数としてrunを呼び出す // 無名関数 run( () => println("anonymous") ) } // 引数で関数を受け取る関数 def run( f: () => unit) { f() // 引数の関数を実行 } // 関数。"foo"を出力する。 def foo() { println("foo") } }
実行結果です。
100 true foo anonymous
無名関数の書き方はJavaScriptとだいぶ違いますが、Erlangとか関数型言語の影響を受けているんだ!と思えばわかりやすい(かも)。
fun(<引数...>) -> <処理> end // erlang (<引数...>) => <処理> // scala
「end」的なモノが見あたらないのが気になるけど、そのうち出てくると期待。なお、Erlangの高階関数については前に調べたのを参照ください。