書き方はなんとなく分かってきたので文法を見てみる。。
関数定義
def p(x:Any) = { println(x) }
クラス定義
class Hoge(i:Int) { var x:Int = i val y:Int = 1 def z(v:String) = { println(v) } }
javascriptのfunctionキーワードがclassになったかのような変態的なクラス定義だ。さらに
class Hoge(var x:Int) {} (new Hoge(4)).x => 4
一行でコンストラクタとプロパティができる。
traitとミックスイン、クラスの継承
継承は単一継承、traitはRubyのモジュールみたいなの。いくつでもクラスにミックスインできる。
trait Piyo { def piyp = { println("piyo") } } trait Puyo { def puyo = { println("puyo") } } class Hoge { def hoge = { println("hoge") } } class Moge { def moge = { println("moge") } } // 継承 class Fuga extends Hoge {} // ミックスイン class Fuga extends Piyo {} class Fuga extends Piyo with Puyo {} // 継承とミックスイン class Fuga extends Hoge with Puyo with Piyo {} // これはエラー、最初のミックスインはextendsキーワードで class Fuga with Piyo with Puyo {} // これもエラー、継承とミックスインは継承を先に書く class Fuga extends Piyo with Puyo with Hoge {} // 多重継承はだめ class Fuga extends Hoge with Moge {}
順序に制限があるなら、ミックスインをwithキーワード、継承をextendsキーワードにすればいいのに…
カリー化
def multiply(a:Int)(b:Int) = { a * b } def m2 = multiply(2) _ m2(4) => 8
こりゃすげえ、と言いたいところだが…
def m2 = multiply(2) _
ケツに _ が必要、いまいちセンスが悪い。また、普通に定義した関数の場合
def multiply(a:Int, b:Int) = { a * b } def m3 = Function.curried(multiply _)(3) m3(4) => 12
うーん
なんとなく
言語としては面白そうな匂いがするのだけど、いまいちシンタックスの筋が悪いような…。
スクリプト的に簡単に記述できるようにしたJavaの亜種的に思われているらしい。しかし、ScalaはJavaのラッパ言語なんてヌルイもんじゃない。Java言語依存の部分は多いとはいえ、まったく別モノだと思った方が良い。