2016-07-01 4 views
1

테이블 헥스 ID를 얻는 방법을 알고 싶습니다. 나는 일을 알고 :루아 - 테이블 16 진수 식별자를 얻으려면

local some_var = {} 
print (some_var) 

결과는 (예를 들어)입니다 :

table: 0x21581c0 

나는 table: 문자열없이 진수를 원한다. 나는 어쩌면 당신의 일부 나 정규 표현식 (또는 비슷한) 그 문자를 제거 할 수 있도록 제안 할 것을 알고,하지만 난 당신을 것을 피하고, 단지 복잡한 패턴없이 0x21581c0

감사에게

답변

1

을, 표준 함수는 here입니다. stanard 'tostring'함수는 테이블에 대해 보여주는 16 진수를 검색하는 유일한 방법입니다.

불행히도 모든 테이블에서 다르게 기능을 수행하는 구성이 없습니다.

그럼에도 불구하고, 몇 가지 수정 사항이 있습니다. 당신은 당신 자신의 함수를 생성하고 매번 그 대신에 호출 할 수 있습니다. 또는 자신의 함수에 대해 전역 변수 print 또는 tostring을 가리킬 수 있습니다. 또는 각각의 테이블에 __tostring 메타 메서드를 설정하면 tostring에 대해 다른 대답을 반환해야합니다. 이것의 장점은 하나의 설정 단계로 원하는 형식을 얻을 수 있다는 것입니다. 단점은 각 테이블을 설정해야한다는 것입니다.

+0

그래, 정규 표현식을 피하고 싶었지만 다른 방법이없는 것 같다. 감사 – dani24

1

을 얻으려면 첫 번째 공간을 검색하고 뒤 따르는 부분 문자열을 가져올 수 있습니다.

function get_mem_addr (object) 
    local str = tostring(object)  
    return str:sub(str:find(' ') + 1) 
end 

print(get_mem_addr({})) -- 0x109638 
print(get_mem_addr(function() end)) -- 0x108cf8 

이 기능은 테이블 및 기능과 함께 작동하지만 다른 것을 전달하면 오류가 발생할 것으로 예상됩니다.

또는 당신은 작은 유형 검사 사용할 수 있습니다, 글로벌 변수 'tostring'을 통해 호출 표준 함수를 참조 글로벌 '인쇄'변수가 표준 구현에

function get_mem_addr (o) 
    return tostring(o):sub(type(o):len() + 3) 
end 
+0

__tostring 메타 테이블이있는 테이블에서는이 기능이 작동하지 않습니다. 나는 이것을 C 코드없이 해결할 방법을 모른다. – moteus

0

OP에서 지정한 테이블 ID는 Lua 버전에서 유효하지 않습니다 (Roblox에서는 5.1). 유효한 ID는 길이가 8이고 9가 아니라 예제입니다. 어느 쪽이든, 그냥 문자열.sub를 사용하여 하위 문자열을 얻을 수 있습니다.

string.sub(tostring({}), 8) 

이유는 'table :'은 7 자 길이이므로 색인 8에서 16 진수 값을 반환하는 문자열의 끝까지 가져옵니다.