在Lua中,你能从'self'获取对象名称吗?
2014-4-12 17:37:58
收藏:0
阅读:172
评论:2
我可能忽略了一些非常简单的东西,但是在Lua中调用对象上的方法时,有没有办法从self变量中获取该对象的名称?
为了说明我的意思,这里是一个有点牵强附会的例子 - 一个简单的堆栈实现:
Stack = {}
function Stack:new (...)
instance = {}
instance.elements = {...}
setmetatable(instance, self)
self.__index = self
return instance
end
function Stack:push (...)
for i,v in pairs({...}) do
table.insert(self.elements,v)
end
end
function Stack:pop ()
if #self.elements > 0 then
return table.remove(self.elements)
else
error("Cannot pop, Stack is empty")
end
end
my_stack = Stack:new(2,4)
my_stack:push("dog") -- my_stack.elements = {2,4,"dog"}
print(my_stack:pop()) -- "dog"
print(my_stack:pop()) -- "4"
print(my_stack:pop()) -- "2"
print(my_stack:pop()) -- error: "Cannot pop, Stack is empty"
是否可以在Stack:pop错误消息中使用self变量来输出调用它的对象的名称?我希望错误消息说“ Cannot pop, Stack 'my_stack' is empty”。
点赞
用户1847592
local function get_my_self_name(self)
local i = debug.getinfo(3, 'Sl');
return "'"..(io.open(i.source:match'@(.*)'):read'*a'
:gsub('.-\n','',i.currentline-1)
:match('(.-)[:.]%s*'..debug.getinfo(2,'n').name..'%s*%(')
:match'([%w_]+)%s*$' or '<unnamed>').."' at line #"..i.currentline
end
local Stack = {}
function Stack:new (...)
local instance = {}
instance.elements = {...}
setmetatable(instance, self)
self.__index = self
return instance
end
function Stack:push (...)
for i,v in ipairs({...}) do
table.insert(self.elements,v)
end
end
function Stack:pop ()
if #self.elements > 0 then
return table.remove(self.elements)
else
error("Can't pop, Stack "..get_my_self_name(self).." is empty")
end
end
local my_stack = Stack:new(2,4)
my_stack:push("dog") --my_stack.elements = {2,4,"dog"}
print(my_stack:pop()) --"dog"
print(my_stack:pop()) --"4"
print(my_stack:pop()) --"2"
print(my_stack:pop()) --error: Can't pop, Stack 'my_stack' at line #35 is empty
2014-04-12 18:50:08
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

在 Lua 中,对象没有名字。只有引用有名字,变量和表字段最终只是对对象的引用。所以,如果您想知道如何从
self变量中获取引用的名称,显然是无法的,因为可能有任意数量的引用具有不同的名称,那么"self.getName()"会返回哪一个名称呢?您可以在构造时为每个对象分配唯一标识符。然后,
new()的一个参数将是对象名称,您将把它保存为self.name(例如),然后您可以根据需要访问它(我想象一下,用于记录消息或在某些关联数组中进行查找)。所以您会这样做my_stack = Stack:new("my_stack", 2,4) my_stack:push("dog") -- my_stack.elements = {2,4,"dog"}我不知道有没有办法让
new()发现新实例将被分配给变量my_stack。实际上,我甚至怀疑即使是使用调试模块也是不可能的,因为分配只会在new返回后发生。因此,没有任何东西强制对象的名称与变量相同,这完全取决于您自己。这甚至不是您想要的东西,因为,再次提醒一下,您可能有对同一堆栈对象的多个引用:a = Stack:new("a", 2,4) b = a -- b和a在内存中是同一个对象错误消息应该提到
a还是b?我认为更好的方式是为对象分配一个ID,然后您始终知道出现错误消息所涉及的对象:a = Stack:new("my_stack_1", 2,4) b = a t = { b = { c = a } } a:push("dog") -- 错误将提到my_stack_1:明确您正在引用哪个对象 t.b.c:push("dog") -- 错误将提到my_stack_1:仍然明确您正在引用哪个对象如果您担心无法从错误消息中确定哪行调用
new(self, "dog"),那么debug模块可能会很有用:使用它,您可以获取调用所在的行号和文件,因此您可以说"对象my_stack_1:pop(): 栈中没有元素了(由文件Y的第X行调用)"