前回はHelloWorldを実行するところまででした。今回は、Javaとの統合についてを扱います。
3 Interaction with Java
なにはともあれ、写経から始めましょう。
object BigFactorial {
import java.math.BigInteger, BigInteger._
def fact(x: BigInteger): BigInteger =
if (x == ZERO) ONE
else x multiply fact(x subtract ONE)
def main(args: Array[String]) {
val x = new BigInteger("100")
println("fact(100) = " + fact(x))
}
}
Javaとの統合についてですが、普通にimportが利用できるようです。とはいえ、見慣れないカンマやアンダースコアがでてきます。本文によると、これはScalaではアスタリスクをメソッド名などの識別子として利用できるため、その代替とのことです。
ということは、アンダースコアをメソッド名に利用できないのでしょうか。snake_caseも好きなので、これはなんだか納得できないところです。ちょっと修正したものを試してみましょう。……無事に動きますね。謎です。
import文は、カンマで続けて書くことができます。import A, Bとかけば、AとBをimportするということです。また、BigInteger._という表記はJava 5で導入された静的インポートと同じようです。
x == ZEROという表記があらわれますが、これは==がequalsのエイリアスとしてあつかわれるようです。==というメソッドであってもオブジェクトの同一性ではなく同値性を求めるわけです。
あ、==はメソッドとかいちゃいましたが、これは本当にメソッドらしいです。x.==(ZERO) という表記は x == ZERO としても書けるそうです。なんだかDSLとかにとって微妙に便利っぽいですね。

コメントする