姓名变量 Lua

我在 Lua 中有以下代码:

ABC:

test (X)

test 函数是用 C++ 实现的。我的问题是:我需要知道作为参数传递的变量名(在这种情况下是 X)。在 C++ 中只能访问这个变量的值,但我必须知道它的名字。

请帮忙

原文链接 https://stackoverflow.com/questions/8932852

点赞
stackoverflow用户734069
stackoverflow用户734069

功能不是传递变量;它们传递的是_值_。变量只是存储值的位置。

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

所以当您说 test(X) 时,您是在说:“从变量X获取值,并将该值作为第一个参数传递给函数test”。

似乎您想要做的是更改 X 的内容,对吗?您想让 test 函数以某种方式修改 X。嗯,在 Lua 中,您不能真正直接这样做。也不应该。

你看,在 Lua 中,你可以从函数中返回值。而且你可以返回_多个_值。即使从 C++ 代码,你也可以返回多个值。因此,您想存储在X中的任何内容都可以返回:

X = test(X)

这样,函数的_调用者_决定如何处理该值,而不是函数本身。如果调用者想要修改变量,那也可以。如果调用者想要将其粘贴到其他地方,那也可以。无论如何,您的功能都_不应该关心_。

此外,这使用户可以执行诸如test(5)之类的操作。这里没有变量;你只是直接传递一个_value_。这就是为什么函数无法修改传递的“变量”的原因之一;因为它不必是变量。只传递值,因此用户可以直接传递文字量值,而不是存储在变量中的值。

简而言之:您无法这样做,也不应该这样做。

2012-01-19 21:25:00
stackoverflow用户221955
stackoverflow用户221955

如果你想要参数的字符串表示形式,那么在 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。他们甚至有一个更好的“断言”的例子。

2012-01-20 08:53:30
stackoverflow用户596285
stackoverflow用户596285

正确答案是 Lua 并不真正支持此功能,但有 debug 接口。查看 这个问题 获取您正在寻找的解决方案。如果您无法直接从 C++ 中调用 debug,请使用 Lua 函数包装函数调用,首先提取 debug 结果,然后调用您的 C++ 函数。

2012-01-20 12:59:38