2017-04-07 23 views
3

Luaでrawget/setが__index/__ newindexをバイパスする方法を__tostringをバイパスすることはできますか?たとえば

local my_table = { name = "my table" } 
local my_table_mt = {} 

function my_table_mt.__tostring(tbl) 
    return "%s<%s>":format(tbl.name or "?", rawtostring(tbl)) 
end 

はこの可能のようなものですか? rawtostringメソッドが存在しないことは知っていますが、この動作をエミュレートしたり、それを完全にバイパスする方法がありますか?

答えて

2

のみ、この場しのぎがあります:

function rawtostring(t) 
    local m=getmetatable(t) 
    local f=m.__tostring 
    m.__tostring=nil 
    local s=tostring(t) 
    m.__tostring=f 
    return s 
end 
+0

はこのスレッドセーフですか? – Llamageddon

+0

真のメタテーブルを隠すために '__metatable'を使うコードを扱うときは、普通の' getmetatable'の代わりに 'debug.getmetatable'を使うことを忘れないでください。 ( '__metatable'が途中であり、制限された環境などで' debug'モジュールを使うことができない場合は運がありません) – nobody

+0

このコードはLuaでは完全に安全です。あなたがグローバルなロックを構築しない限り、Luaはスレッドセーフではありません。異なるOSスレッドで異なるLua状態を使用する – lhf