将变量命名为Lua

Name variable Lua

本文关键字:Lua 命名为 变量      更新时间:2023-10-16

我在Lua中有以下代码:ABC:

test (X)

测试函数是用C++实现的。我的问题是:我需要知道作为参数传递的变量名是什么(在本例中为X)。在C++中只能访问这个变量的值,但我必须知道她的名字。

请帮助

函数不是传递的变量;它们被传递。变量只是存储值的位置。

当你在Lua代码中的某个地方说X时,这意味着从变量X中获得(注意:它实际上比这更复杂,但我在这里不讨论)。

因此,当你说test(X)时,你说的是,"从变量X中获取值,并将该值作为第一个参数传递给函数test。"

你想做的似乎是更改X的内容,对吧?您希望test函数以某种方式修改X。好吧,你真的不能在卢阿直接做到这一点。你也不应该。

请看,在Lua中,您可以从函数中返回值。您可以返回多个值。即使使用C++代码,也可以返回多个值。因此,无论你想存储在X中的是什么,都可以返回:

X = test(X)

这样,函数的调用者决定如何处理值,而不是函数本身。如果调用者想要修改变量,那没关系。如果打电话的人想把它放在其他地方,那也没关系。您的函数不应该以这样或那样的方式关心

此外,这允许用户执行类似test(5)的操作。这里,没有变量;您只需直接传递。这就是为什么函数不能修改传递的"变量"的原因之一;因为它不具有作为变量。只传递值,因此用户可以简单地传递一个文本值,而不是存储在变量中的值。

简而言之:你不能做,也不应该想做。

正确的答案是Lua并不真正支持这一点,但有调试接口。请参阅此问题以获得您正在寻找的解决方案。如果您无法直接从C++获得调试调用,请使用Lua函数包装函数调用,该函数首先提取调试结果,然后调用C++函数。

如果您想要的是参数的字符串表示,那么您就有点陷入了lua。

我在想一些类似于C:的东西

assert( x==y );

这会产生一个关于失败的好消息。在C中,这是通过宏实现的。像这样的东西(未经测试,可能坏了)。

#define assert(X) if(!(X)) { printf("ASSERION FAILED: %sn", #X ); abort(); }

这里#X表示参数的字符串形式。在上面的例子中,它是"x==y"。请注意,这与变量名有细微的不同——它只是解析器在扩展宏时使用的字符串。

不幸的是,lua中没有这样的相应功能。对于我的lua测试库,我最终将字符串化版本作为表达式的一部分传递,所以在lua中,我的代码看起来像这样:

assert( x==y, "x==y")

可能有一些方法可以使用某种字符串求值和闭包机制将其作为assert("x==y")来工作,但对我来说,这似乎很棘手,值得做

编辑:

虽然这在纯lua中似乎不可能实现,但有一个补丁版本似乎确实支持宏:http://lua-users.org/wiki/LuaMacros。他们甚至有一个更好的assert的例子。