Luaのクラス表現
と、Luaにはクラスがない。
クラスがないので、連想配列とクロージャを使ってクラスオブジェクトを表現する。
Hoge = {} function Hoge.new(value) local hoge = { value_ = value, getValue = function(self) return self.value_ end, setValue = function(self,value) self.value_ = value end, } return hoge end o = {} o[0] = Hoge.new(1) o[0]:setValue(666) o[1] = Hoge.new(2) print (o[0]:getValue()) print (o[1]:getValue())
と実行すると、
666
2
と出力される。
要するにlocal hogeはクロージャによってfunction Hoge.newが呼ばれるたびに生成されるため、
これをオブジェクトとして扱っている訳だ。
さて、
ここで、変わった表記がある。
o[0].setValue(...)や
o[0].getValue()ではない。
o[0]:setValue(...)
o[0]:getValue()
になっている。
そう、.(ピリオド)でなく:(コロン)でメソッドを呼んでいる。
これは、
o[0]:setValue(666)
が、
o[0].setValue(o[0],666)
と等価であることに起因している。
実はselfを書くのはちょっと……という人のための、
SyntaxSugarになってる。
これはちょっと面白い。
selfがいらないようなクラスメソッドならこう書く必要はない。
けど、protoypeがないのでそれ毎に生成されたらたまらん、という人もいると思う。
これはきっとテクニークがあると思うんだけど……。(Hoge.newのように別途つくるべきかな)
まだわからないw
勉強中です、はい。