gpt4 book ai didi

lua - 在 Lua 中,是否有一个函数给定一个函数,它将其名称作为字符串返回?

转载 作者:行者123 更新时间:2023-12-04 18:49:51 25 4
gpt4 key购买 nike

对不起,如果这太明显了,但我是 lua 的新手,我在引用中找不到它。

Lua 中是否有一个 NAME_OF_FUNCTION 函数,给定一个函数给我它的名字,以便我可以用它索引一个表?我想要这个的原因是我想做这样的事情:

local M = {}

local function export(...)
for x in ...
M[NAME_OF_FUNCTION(x)] = x
end
end

local function fun1(...)
...
end

local function fun2(...)
...
end

.
.
.

export(fun1, fun2, ...)

return M

最佳答案

根本没有这样的功能。我想没有这样的功能,因为功能是一等公民。因此,函数只是一个值,就像其他任何值一样,由变量引用。因此 NAME_OF_FUNCTION函数不会很有用,因为同一个函数可以有很多变量指向它,或者没有。

您可以通过循环遍历表(任意或_G)来模拟全局函数或表中的函数,检查值是否等于x。如果是这样,您已经找到了函数名称。

a=function() print"fun a" end
b=function() print"fun b" end
t={
a=a,
c=b
}
function NameOfFunctionIn(fun,t) --returns the name of a function pointed to by fun in table t
for k,v in pairs(t) do
if v==fun then return k end
end
end
print(NameOfFunctionIn(a,t)) -- prints a, in t
print(NameOfFunctionIn(b,t)) -- prints c
print(NameOfFunctionIn(b,_G)) -- prints b, because b in the global table is b. Kind of a NOOP here really.

另一种方法是将函数包装在一个表中,并设置一个调用该函数的元表,如下所示:
fun1={
fun=function(self,...)
print("Hello from "..self.name)
print("Arguments received:")
for k,v in pairs{...} do print(k,v) end
end,
name="fun1"
}
fun_mt={
__call=function(t,...)
t.fun(t,...)
end,
__tostring=function(t)
return t.name
end
}
setmetatable(fun1,fun_mt)
fun1('foo')
print(fun1) -- or print(tostring(fun1))

由于元表查找,这将比使用裸函数慢一些。并且它不会阻止任何人更改状态中的函数名称,更改包含它的表中的函数名称,更改函数等,因此它不是防篡改的。您也可以通过像 fun1.fun 这样的索引来剥离表如果您将其导出为模块,这可能会很好,但是您会丢失可以放入元表的命名和其他技巧。

关于lua - 在 Lua 中,是否有一个函数给定一个函数,它将其名称作为字符串返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7886757/

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