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

Lua - get table hex identifier

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

local some_var = {}
print (some_var)

结果是(例如):

table: 0x21581c0

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

谢谢

不需要复杂的模式,只搜索第一个space,抓取后面的子串即可。

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

在标准实现中,有一个全局变量'print',它引用一个标准函数,通过全局变量'tostring'调用一个描述here的标准函数。标准 'tostring' 函数是检索它为 table.

显示的十六进制数的唯一方法

不幸的是,没有任何一个函数的配置可以对所有 tables 做不同的事情。

不过,还有几点需要修改。您可以创建自己的函数并每次都调用它,或者将全局变量 printtostring 中的任何一个指向您自己的函数。或者,在您需要 tostring 到 return 的每个 table 上设置一个 __tostring 元方法。这样做的好处是它只需一个设置步骤即可为您提供所需的格式。缺点是每个table.

都要设置
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)

OP 声明的 table id 在我使用的 Lua 版本中无效(Roblox 中为 5.1)。有效 ID 的长度为 8,而不是您示例中的 9。无论哪种方式,只需使用 string.sub 来获取您之后的子字符串。

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

原因是,'table: ' 有 7 个字符长,所以我们从索引 8 到字符串的末尾取 returns 十六进制值。

这更简单并且适用于与指针关联的所有类型:

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