我想知道如何获取表格十六进制ID。我知道这样做:
local some_var = {}
print (some_var)
结果是(例如):
table: 0x21581c0
我想要没有table:
字符串的十六进制。我知道也许有些人建议我做一个正则表达式(或类似的东西)来删除那些字符,但我想避免这种情况,只是得到0x21581c0
由于
答案 0 :(得分:2)
如果没有复杂的模式,您只需搜索第一个空格,然后获取后面的子字符串。
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
此函数将与表和函数一起使用,但如果您将其他任何内容传递给它,则会出现错误。
或者你可以使用一点点类型检查:
function get_mem_addr (o)
return tostring(o):sub(type(o):len() + 3)
end
答案 1 :(得分:2)
在标准实现中,有一个全局'print'变量引用一个标准函数,它通过全局变量'tostring'调用一个标准函数here。 stanard'tostring'函数是检索它为表显示的十六进制数的唯一方法。
不幸的是,没有任何配置可以为所有表做任何不同的操作。
尽管如此,还有几点需要修改。您可以创建自己的函数并每次调用它,或者将全局变量print
或tostring
中的任何一个指向您自己的函数。或者,在每个需要__tostring
的表格上设置tostring
元方法,以便为其返回不同的答案。这样做的好处是只需一个设置步骤即可获得所需的格式。缺点是你必须设置每个表。
local function simplifyTableToString(t)
local answer = tostring(t):gsub("table: ", "", 1)
local mt = getmetatable(t)
if not mt then
mt = {}
setmetatable(t, mt)
end
mt.__tostring = function() return answer end
end
local a = {}
local b = {}
print(a, b)
simplifyTableToString(a)
print(a, b)
答案 2 :(得分:0)
OP所声明的表ID在我使用的Lua版本(Roblox中为5.1)中无效。有效ID的长度为8,而不是示例中的9。无论哪种方式,只需使用string.sub来获取您所追求的子字符串。
string.sub(tostring({}), 8)
原因是,'table:'是7个字符长,所以我们从索引8到字符串的末尾,返回十六进制值。
答案 3 :(得分:0)
这更简单,适用于所有与指针相关的类型:
local function getId(t)
return string.format("%p", t)
end
print("string:", getId("hi"))
print("table:", getId({}))
print("userdata:", getId(io.stdin))
print("function:", getId(print))
print("number:", getId(1))
print("boolean:", getId(false))
print("nil:", getId(nil))
结果:
string: 0x0109f04638
table: 0x0109f0a270
userdata: 0x01098076c8
function: 0x0109806018
number: NULL
boolean: NULL
nil: NULL