__tostring メタメソッド
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 20/54。
Luaでテーブルをプリントすると、通常はtable: 0x5f8a20のような、単なるメモリアドレスというあまり役に立たないものが表示されます。__tostringメタメソッドを使用すると、テーブルが文字列に変換されるときに何を表示するかを正確に定義することで、この動作を変更できます。
このメタメソッドは、デバッグやよりクリーンな出力を生成する際に特に便利です。Luaがテーブルを文字列に変換する必要がある場合(print()を使用する場合など)、そのテーブルに__tostringフィールドを持つメタテーブルがあるかどうかを確認します。もし存在する場合、Luaはその関数を呼び出し、デフォルトの表現の代わりにその戻り値を使用します。
実装方法は以下の通りです:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- 出力: Vector(3, 4)__tostring 関数は、テーブルを引数として受け取り、文字列を返さなければなりません。この例では、ベクトルの x および y の値を読みやすい形式で示す、フォーマットされた文字列を構築します。
これにより、コードの操作が非常に簡単になります。デバッグ中に不可解なメモリアドレスを見る代わりに、テーブルに含まれている内容に関する有意義な情報を得ることができます。
チャレンジ
簡単x 座標と y 座標を受け取り、カスタム文字列表現を持つポイントテーブルを返す関数 createPoint を作成してください。
x フィールドと y フィールドを持つテーブルを作成し、__tostring メタメソッドを持つメタテーブルをアタッチして、tostring() を使用してテーブルを文字列に変換した結果を返します。
ロジック:
- 提供された座標をキー
xとyに設定したテーブルを作成します "Point(x, y)"形式の文字列を返す__tostringを持つメタテーブルを作成しますsetmetatable()を使用して、ポイントテーブルにメタテーブルをアタッチしますtostring(point)を返して、カスタム文字列表現を取得します
パラメータ:
x(数値): ポイントの x 座標y(数値): ポイントの y 座標
戻り値: "Point(x, y)" 形式のポイントのカスタム文字列表現 (文字列)
チートシート
__tostring メタメソッドを使用すると、テーブルを文字列に変換した際の表示方法をカスタマイズできます。デフォルトでは、テーブルを print すると table: 0x5f8a20 のようなメモリアドレスが表示されます。
Lua がテーブルを文字列に変換するとき(print() などを使用する場合)、そのテーブルに __tostring フィールドを持つメタテーブルがあるかどうかを確認します。存在する場合、Lua はその関数を呼び出し、その戻り値を使用します。
__tostring 関数は引数としてテーブルを受け取り、文字列を返す必要があります:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- 出力: Vector(3, 4)tostring() を使用して明示的にテーブルを文字列に変換することもできます。この場合、__tostring メタメソッドが定義されていれば、それが呼び出されます。
自分で試してみよう
function createPoint(x, y)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。