__tostring メタメソッド
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部。レッスン 20/54。
Luaでテーブルをprintすると、通常は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 の値を読みやすい形式で示す整形済み文字列を構築します。
これにより、コードがずっと扱いやすくなります。デバッグ中に暗号のようなメモリアドレスを目にする代わりに、テーブルに何が含まれているのかを示す意味のある情報を得られます。
チャレンジ
簡単createPoint 関数を作成してください。この関数は x 座標と y 座標を受け取り、カスタム文字列表現を持つ point テーブルを返します。
x フィールドと y フィールドを持つテーブルを作成し、__tostring メタメソッドを持つメタテーブルを関連付け、tostring() を使用してテーブルを文字列に変換した結果を返してください。
ロジック:
- 指定された座標を設定したキー
xとyを持つテーブルを作成する "Point(x, y)"形式の文字列を返す__tostringを持つメタテーブルを作成するsetmetatable()を使用して、メタテーブルを point テーブルに関連付ける- カスタム文字列表現を取得するために
tostring(point)を返す
パラメータ:
x(number): point の x 座標y(number): point の y 座標
戻り値: "Point(x, y)" 形式の point のカスタム文字列表現 (string)
自分で試してみよう
function createPoint(x, y)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックと制御フローのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ