Lua クラスのような実装のサンプル

目次

 

クラスのような実装のサンプル

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を設定すると別のテーブルや関数を使って動的に値を取得できます。

関連の記事

Lua 配列(テーブル)にキーが存在しないとき(__indexメタメソッド)

△上に戻る