Lua - 获取表十六进制标识符

时间:2016-07-01 00:08:13

标签: lua lua-table

我想知道如何获取表格十六进制ID。我知道这样做:

local some_var = {}
print (some_var)

结果是(例如):

table: 0x21581c0

我想要没有table:字符串的十六进制。我知道也许有些人建议我做一个正则表达式(或类似的东西)来删除那些字符,但我想避免这种情况,只是得到0x21581c0

由于

4 个答案:

答案 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'函数是检索它为表显示的十六进制数的唯一方法。

不幸的是,没有任何配置可以为所有表做任何不同的操作。

尽管如此,还有几点需要修改。您可以创建自己的函数并每次调用它,或者将全局变量printtostring中的任何一个指向您自己的函数。或者,在每个需要__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