u16suzuの blog

日々学んだことのメモブログです。

lua の メタテーブルを使ってみる

メタテーブルを使うと、演算子オーバーロドと、テーブルをクラスのように使うことができる。

演算子オーバーロード

__add のように__から始まるメソッドはメタメソッドという。
__indexがでの取得で、__newindexがでの値セット時に呼ばれるメタメソッド。
これら以外のメタメソッドは以下を参照。
http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html#2.8

t1 = { value=20}
t2 = { value=30}

-- + 演算子のメソッドを定義. 
mt = {
  __add = function(l, r)
    return l.value + r.value
  end
}

-- 定義したメソッドをセット
setmetatable( t1, mt)

print( t1 + t2 )
クラス定義

クラス定義と、座標をセットするメソッド、表示するメソッドを定義

Point = {}

function Point:new()
  local t = {}
  t.x = 0
  t.y = 0

  -- local value t へ値をセットするメソッドを追加
  setmetatable( t, {__index = Point})
  return t
end

function Point:set(dx, dy)
  self.x = dx
  self.y = dy
end

function Point:display()
  print( 'x '..self.x..', '..'y '..self.y  )
end

local pt1 = Point:new()
pt1:set( 33, 44 )
pt1:display()