2017-04-07 1 views
3

는 :루아에서 rawget/set이 __index/__ newindex를 우회하는 방식을 무시할 수 있습니까? 예를 들어

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

에만이 kludge 있습니다 :

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

이 코드는 루아에서 완전히 안전합니다. 루아는 전역 잠금을 설정하지 않는 한 스레드로부터 안전하지 않습니다. 다른 OS 스레드에서 다른 Lua 상태 사용 – lhf