setmetatable と getmetatable
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 17/54。
メタテーブルが概念的にどのようなものであるかを理解したところで、次は実際にそれらを扱う方法を学ぶ番です。Luaはこのために2つの不可欠な関数を提供しています:テーブルにメタテーブルをアタッチするための setmetatable() と、それを取得するための getmetatable() です。
テーブルにメタテーブルをアタッチするには、setmetatable()を使用します。この関数は2つの引数を取ります。変更したいテーブル(メインテーブル)と、それにアタッチしたいメタテーブルです:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)この例では、myMetatable が myTable にアタッチされました。メタテーブル自体は今のところ空ですが、これにより2つのテーブル間の接続が確立されます。setmetatable() 関数はメインのテーブルも返すため、必要に応じて操作をチェーンさせることができます。
テーブルにアタッチされているメタテーブルを取得するには、getmetatable()を使用します。
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- 出力: trueこの関数は、メタテーブルが設定されていればそれを返し、テーブルにメタテーブルがなければ nil を返します。これは、メタテーブルが設定された後に、その内容を確認したり変更したりする必要がある場合に役立ちます。
これら2つの関数を理解することは、Luaにおけるすべてのメタテーブル操作の基礎となります。メタテーブルのアタッチと取得ができるようになれば、テーブルの振る舞いを変えるメタメソッドを定義する準備が整ったことになります。
チャレンジ
簡単mainTable と metaTable を受け取り、メタテーブルが正常にアタッチされた場合に true を返す関数 attachMetatable を作成してください。
setmetatable() を使用してメインテーブルにメタテーブルをアタッチし、次に getmetatable() を使用してアタッチされたことを確認します。
ロジック:
setmetatable()を使用してmetaTableをmainTableにアタッチします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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
4メタテーブル入門
メタテーブルとは?setmetatable と getmetatable__index メタメソッド__newindex メタメソッド__tostring メタメソッド算術メタメソッド パート1算術メタメソッド パート2まとめ:読み取り専用テーブル