読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Javaのクラスを使う/すべてはオブジェクト

Scala

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高階関数については前に調べたのを参照ください。