プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

Luaのオブジェクト指向プログラミング考察

モジュールでクラス定義を行う方法。
ついでにプライベート変数を定義する方法も。

※この記事のプライベート変数定義には問題があるため考察3も参照

モジュール定義(mod.lua

local _M = {}
local _ = {}	--プライベート変数を保持するテーブル

function _M:new(o)
	o = o or {}
	_[o] = {}
	self.__index = self
	return setmetatable(o, self)
end

function _M:setA(v)
	_[self].a = v
end

function _M:showA()
	print(_[self].a)
end

return _M

プログラム本体(main.lua

m = require "mod"

o1 = m:new()
o2 = m:new()

o1:setA(100)
o2:setA(200)

o1:showA()  -->100
o2:showA()  -->200

モジュール内のローカル変数はメインチャンクとは別の環境なので、main.luaからプライベート変数に直接アクセスすることは出来ない。

newの引数でプライベート変数の初期値を取って、_[o] = {}の行でプライベート変数の初期化を行えば、C++Javaコンストラクタで初期化するのと似たような効果が得られる。
ただLuaのプログラムにおいて、ここまでしてプライベート性を保つ必要があるかは疑問である。