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

我想知道如何获取表格的十六进制标识符。我知道可以通过下面的代码:

local some_var = {}
print (some_var)

结果可能是这样的:

table: 0x21581c0

我想要的是不带table:字符串的十六进制数。我知道有人可能建议我使用正则表达式(或类似的方法)来删除那些字符,但我想避免这样做,只想得到0x21581c0

谢谢

点赞
用户2505965
用户2505965

不需要复杂的模式匹配,你只需要搜索第一个空格,然后抓取其后的子串。

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
2016-07-01 01:02:08
用户2226988
用户2226988

在标准实现中,有一个全局变量'print',它指向一个标准函数,该函数通过全局变量'tostring'调用一个标准函数,在此处描述。标准的'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)
2016-07-02 23:33:42
用户5484501
用户5484501

在我使用的 Lua 版本中(Roblox 中的 5.1 版本),OP 给出的表 ID 是无效的。有效的 ID 长度为 8,而不是你的示例中的 9。不管怎样,只需使用 string.sub 获取你需要的子字符串。

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

原因是“ table:”的长度为 7 个字符,所以我们从索引 8 开始取到字符串末尾,这将返回十六进制值。

2017-09-02 05:21:09
用户4634964
用户4634964

以下是简单的代码,适用于所有与指针相关联的类型:

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
2021-04-04 21:11:02