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

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
勉強中です、はい。