gpt4 book ai didi

lua - 获取lua中函数的参数名称

转载 作者:行者123 更新时间:2023-12-02 02:27:25 25 4
gpt4 key购买 nike

当调用lua函数时

PrintMe(我的变量名称)

我希望能够实际打印“MyVariableName”而不是它的值(好吧,用于演示目的)。

显然我可以只传递字符串,但这需要额外的引号,而且我还想打印它的值。

例如,

MyVariable = 4
PrintVariable(MyVariable)

会打印“MyVariable is 4”或其他内容

我不想像这样重复名称和变量

PrintVariable(MyVariable, "MyVariable")

因为这是不必要的重复。

lua能处理吗?

我现在正在做的是在引号中传递变量名称并使用 loadstring 来获取值,但我想直接传递变量而不使用额外的不必要的引号(我认为 debug.getlocal 这样做了,但最终结果是返回值而不是名称)。

<小时/>

这是模拟示例

function printme1(var, val)
print(var.." = "..val)
end

function printme2(v)
local r
loadstring("r = "..v)() -- equivalent to r = a but must be used since v is a string representing a and not the object a
print(v.." = "..tostring(r))
end

function printme3(v)
-- unknown
end

a = 3

printme1("a", a)
printme2("a")
printme3(a)

在这种情况下,所有 3 个应该打印相同的内容。 printme3 显然是最方便的。

最佳答案

你不能说PrintVariable(MyVariable),因为Lua无法让你确定哪个变量(如果有的话;可以使用常量)用于将参数传递给你的函数。但是,您可以PrintVariable('MyVariable') 然后使用调试 API 在调用者的作用域中查找具有该名称的局部变量:

function PrintVariable(name)
-- default to showing the global with that name, if any
local value = _G[name]

-- see if we can find a local in the caller's scope with that name
for i=1,math.huge do
local localname, localvalue = debug.getlocal(2,i,1)
if not localname then
break -- no more locals to check
elseif localname == name then
value = localvalue
end
end

if value then
print(string.format("%s = %s", name, tostring(value)))
else
print(string.format("No variable named '%s' found.", name))
end
end

现在你可以说:

PrintVariable('MyVariable')

在本例中将打印“MyVariable = 4”。

<小时/>

不,如果您真的想要在不带引号的情况下执行此操作,您可以检查调用者的局部变量是否具有提供的值,但这偶尔会给您提供错误的变量名称(如果存在)调用者作用域内有多个具有给定值的变量。话虽如此,您可以这样做:

function PrintVariable(value)
local name

-- see if we can find a local in the caller's scope with the given value
for i=1,math.huge do
local localname, localvalue = debug.getlocal(2,i,1)
if not localname then
break
elseif localvalue == value then
name = localname
end
end

-- if we couldn't find a local, check globals
if not name then
for globalname, globalvalue in pairs(_G) do
if globalvalue == value then
name = globalname
end
end
end

if name then
print(string.format("%s = %s", name, tostring(value)))
else
print(string.format("No variable found for the value '%s'.", tostring(value)))
end
end

现在你可以说PrintVariable(MyVariable),但是如果调用者的作用域中碰巧有另一个值为4的变量,并且它发生在之前MyVariable,它是要打印的变量名称。

关于lua - 获取lua中函数的参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com