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 做不同的事情。
不过,还有几点需要修改。您可以创建自己的函数并每次都调用它,或者将全局变量 print
或 tostring
中的任何一个指向您自己的函数。或者,在您需要 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
我想知道如何获取 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 做不同的事情。
不过,还有几点需要修改。您可以创建自己的函数并每次都调用它,或者将全局变量 print
或 tostring
中的任何一个指向您自己的函数。或者,在您需要 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