2016-07-01 14 views
1

Ich möchte wissen, wie man die Tabelle hex id. Ich weiß, das zu tun:Lua - get Tabelle hex Bezeichner

local some_var = {} 
print (some_var) 

das Ergebnis ist (zum Beispiel):

table: 0x21581c0 

ich die hex will, ohne den table: String. Ich weiß, dass vielleicht einige von Ihnen vorschlagen, mir einen regulären Ausdruck zu machen (oder so ähnlich), um diese Zeichen zu entfernen, aber ich möchte, dass vermeiden, und erhalten nur die 0x21581c0

Dank

Antwort

1

In der Standardausführung gibt es den global ist ‚Druck‘ Variable, die auf eine Standardfunktion bezieht, die durch die globale Variable ‚tostring‘ nennt, eine Standardfunktion beschrieben here. Die Stantring-Funktion 'tostring' ist die einzige Möglichkeit, die hexadezimale Zahl für eine Tabelle abzurufen.

Leider gibt es keine Konfiguration für eine der Funktionen, um für alle Tabellen etwas anderes zu tun.

Nichtsdestotrotz gibt es mehrere Punkte für die Modifikation. Sie können eine eigene Funktion erstellen und diese jedes Mal aufrufen oder eine der globalen Variablen print oder tostring auf Ihre eigenen Funktionen zeigen. Oder setzen Sie eine __tostring Metamethode auf jeder Tabelle, die Sie benötigen tostring, um eine andere Antwort für zurückzukehren. Der Vorteil ist, dass Sie mit nur einem Setup-Schritt das gewünschte Format erhalten. Der Nachteil ist, dass Sie jede Tabelle einrichten müssen.

+0

Ja, ich wollte den regulären Ausdruck vermeiden, aber es scheint, dass es keinen anderen Weg gibt. Vielen Dank – dani24

1

Ohne komplexe Muster, Sie kann einfach nach dem ersten Leerzeichen suchen und den Teilstring von dem, was folgt, verwenden.

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 

Diese Funktion wird mit Tabellen und Funktionen arbeiten, aber Fehler erwarten, wenn Sie es noch etwas passieren.

Oder Sie können eine wenig Typprüfung verwenden:

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

Leider funktioniert dies nicht mit Tabellen mit __tostring metatable. Ich kenne keine Lösung dafür ohne C-Code. – moteus

0

Die vom OP angegebene Tabellen-ID ist in der von mir verwendeten Version von Lua ungültig (5.1 in Roblox). Eine gültige ID ist die Länge 8, nicht 9 wie in Ihrem Beispiel. Wie auch immer, benutze einfach string_, um den Sub-String zu erhalten, nach dem du suchst.

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

Der Grund dafür ist, ‚table:‘ ist 7 Zeichen lang, so nehmen wir aus dem Index 8 durch das Ende der Zeichenkette, die den Hexadezimalwert zurückgibt.