我在Lua中有以下代码: ABC:
test (X)
测试功能在C ++中实现。我的问题是:我需要知道变量名称作为参数传递的内容(在本例中为X)。在C ++中只能访问这个变量的值,但我必须知道她的名字。
请帮助
答案 0 :(得分:3)
函数不是传递变量;它们被传递值。变量只是存储值的位置。
当你在Lua代码的某个地方说X
时,这意味着从变量X
获取值(注意:它实际上比这更复杂,但是我不会进入这里)。
因此,当您说test(X)
时,您说“从变量X
获取值并将该值作为第一个参数传递给函数test
。”
您想要做的是更改 X
的内容,对吧?您希望以某种方式使test
函数修改X
。嗯,你不能真的直接在Lua那样做。你也不应该。
在Lua中,您可以从函数返回值。您可以返回多个值。即使从C ++代码,您也可以返回多个值。因此,无论您希望存储在X
中的是什么,都可以返回:
X = test(X)
这样,函数的调用者决定如何处理值,而不是函数本身。如果调用者想要修改变量,那很好。如果来电者想把它贴在其他地方,那也没关系。你的函数不应该关心这种或那种方式。
此外,这允许用户执行test(5)
之类的操作。这里,是没有变量;您只需直接传递值即可。这就是为什么函数不能修改传递的“变量”的原因之一;因为 不是变量。只传递值,因此用户可以简单地传递一个文字值而不是一个存储在变量中的值。
简而言之:你做不到,你不应该这样做。
答案 1 :(得分:1)
正确的答案是Lua并不真正支持这一点,但是有调试接口。有关您正在寻找的解决方案,请参阅this question。如果你无法调用调试直接从C ++工作,那么用Lua函数包装你的函数调用,该函数首先提取调试结果,然后调用你的C ++函数。
答案 2 :(得分:0)
如果你所追求的是参数的字符串表示,那么你就会被困在lua中。
我在想C:
assert( x==y );
在失败时生成一条好消息。在C中,这是通过宏完成的。 这样的事情(未经测试,可能已经破裂)。
#define assert(X) if(!(X)) { printf("ASSERION FAILED: %s\n", #X ); abort(); }
这里#X
表示参数的字符串形式。在上面的例子中是“x == y”。请注意,这与变量名称略有不同 - 它只是扩展宏时解析器中使用的字符串。
不幸的是,lua中没有这样的相应功能。对于我的lua测试库,我最终将字符串化版本作为表达式的一部分传递,因此在lua中我的代码看起来像这样:
assert( x==y, "x==y")
可能有一些方法可以使用某种字符串评估和闭包机制将其作为assert("x==y")
工作,但是值得为我做这件事似乎很棘手。
编辑:
虽然这在纯lua中似乎不可能,但是有一个看似支持宏的修补版本:http://lua-users.org/wiki/LuaMacros。他们甚至有一个更好的assert
的例子。