Menu
Coddy logo textTech

setmetatable と getmetatable

CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 17/54。

メタテーブルが概念的にどのようなものであるかを理解したところで、次は実際にそれらを扱う方法を学ぶ番です。Luaはこのために2つの不可欠な関数を提供しています:テーブルにメタテーブルをアタッチするための setmetatable() と、それを取得するための getmetatable() です。

テーブルにメタテーブルをアタッチするには、setmetatable()を使用します。この関数は2つの引数を取ります。変更したいテーブル(メインテーブル)と、それにアタッチしたいメタテーブルです:

local myTable = {name = "Alice"}
local myMetatable = {}

setmetatable(myTable, myMetatable)

この例では、myMetatablemyTable にアタッチされました。メタテーブル自体は今のところ空ですが、これにより2つのテーブル間の接続が確立されます。setmetatable() 関数はメインのテーブルも返すため、必要に応じて操作をチェーンさせることができます。

テーブルにアタッチされているメタテーブルを取得するには、getmetatable()を使用します。

local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable)  -- 出力: true

この関数は、メタテーブルが設定されていればそれを返し、テーブルにメタテーブルがなければ nil を返します。これは、メタテーブルが設定された後に、その内容を確認したり変更したりする必要がある場合に役立ちます。

これら2つの関数を理解することは、Luaにおけるすべてのメタテーブル操作の基礎となります。メタテーブルのアタッチと取得ができるようになれば、テーブルの振る舞いを変えるメタメソッドを定義する準備が整ったことになります。

challenge icon

チャレンジ

簡単

mainTablemetaTable を受け取り、メタテーブルが正常にアタッチされた場合に true を返す関数 attachMetatable を作成してください。

setmetatable() を使用してメインテーブルにメタテーブルをアタッチし、次に getmetatable() を使用してアタッチされたことを確認します。

ロジック:

  • setmetatable() を使用して metaTablemainTable にアタッチします
  • getmetatable() を使用してアタッチされたメタテーブルを取得します
  • 取得したメタテーブルを元の metaTable と比較します
  • 一致する場合は true を、そうでない場合は false を返します

パラメータ:

  • mainTable (table): メタテーブルがアタッチされるテーブル
  • metaTable (table): アタッチするメタテーブル

戻り値: メタテーブルが正常にアタッチされ確認された場合は true、そうでない場合は false (boolean)

チートシート

Luaは、メタテーブルを操作するための2つの重要な関数を提供しています:

setmetatable() - テーブルにメタテーブルをアタッチします。メインのテーブルとアタッチするメタテーブルの2つの引数を取ります。メインのテーブルを返します。

local myTable = {name = "Alice"}
local myMetatable = {}

setmetatable(myTable, myMetatable)

getmetatable() - テーブルにアタッチされているメタテーブルを取得します。メタテーブルがアタッチされている場合はそのメタテーブルを返し、テーブルにメタテーブルがない場合は nil を返します。

local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable)  -- 出力: true

自分で試してみよう

function attachMetatable(mainTable, metaTable)
    -- ここにコードを記述してください
end
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン