将变量命名为Lua
Name variable Lua
我在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
的例子。
- 在Arduino中将PWM通道命名为LEDC是否有特定原因
- C++ std::future 方法应该<T>命名为 is_ready() 还是 ready()?
- 具有全局符号的命名为STD符号Interfier
- 命名为pybind11中的默认参数
- 将文件命名为C
- 将文件重命名为已存在的文件名
- 如果(玩家[P] .setCoin(Gameboard,Input))将其命名为“在线”游戏板的攻击函数)
- 将 .c 文件重命名为 .cpp,导入 Cython 库失败
- 为什么将可执行文件重命名为临时文件的此代码段不能按预期工作?
- 如何在 C++ 中将文件从 ext4 文件系统重命名为 ntfs 文件系统
- 配对的变异模板(命名为元组)
- 被命名为SecurityInfo间歇性故障,错误= 2
- 函数可以命名为default吗
- opencv 命名为 Window leak (C++ 和 opencv)
- 如果我将函数命名为"交换",为什么会出现模板错误,但"交换"可以?
- 从工作iOS项目中导入.cpp文件并将其重命名为.mm问题
- 将 std::vector 重命名为另一个类以进行重载
- 在C/C++中将文件重命名为unicode名称
- RCPP 命名为数字矩阵
- 将变量命名为Lua