読者です 読者をやめる 読者になる 読者になる

Scalaの関数とクラス

書き方はなんとなく分かってきたので文法を見てみる。。

関数定義

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言語依存の部分は多いとはいえ、まったく別モノだと思った方が良い。