目次
01. クラス
クラスのような実装のサンプル
Luaにはクラスの概念はありませんが、__indexを使うとクラスのような振る舞いを実装できます。
Color = {name = ""}
function Color:new(name)
local obj = {name = name}
setmetatable(obj, self) -- obj のメタテーブルを Color に設定
self.__index = self -- __index を自身に設定することで、メソッド検索を可能にする
return obj
end
function Color:getName()
print(self.name)
end
-- インスタンス作成
local a = Color:new("red")
local b = Color:new("blue")
a:getName() -- red
b:getName() -- blue
15行目のColor:new("red")を呼び出すと、新しいテーブルobjが作られます。
5行目のsetmetatable(obj, self) により、obj のメタテーブルがColorになります。
6行目のself.__index = self により、objに存在しないメソッド(例: getName)を呼び出すとColorから探して実行できます。
__index
__indexはLuaのメタテーブル機能の一部で、テーブル内に存在しないキーが参照されたときに代わりに使用されるメタメソッドです。
通常、Luaでは存在しないキーを参照するとnilが返されますが、__indexを設定すると別のテーブルや関数を使って動的に値を取得できます。
関連の記事