Lua 中是否有一种函数,能够输入一个函数,然后返回该函数的名称字符串?

抱歉,如果这个问题太简单了,但我是 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

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

点赞
stackoverflow用户878491
stackoverflow用户878491

请尝试这个链接:

http://pgl.yoyo.org/luai/i/tostring

tostring( x ) 应该是你要寻找的功能。

2011-10-25 08:44:55
stackoverflow用户106979
stackoverflow用户106979

如果我没错的话(但实际上我从未在 Lua 中编程,只是阅读过很多论文和文章),内部已经有一个带有函数名称的表(类似于 Python 中的 localsglobals),因此您应该能够执行反向查找以查看哪个键与函数引用匹配。

无论如何,这只是猜测。

但事实是,查看您的代码,您已经知道函数的名称,因此可以自由构造表格。如果您想要减少出错的可能性,最好使用函数名称来获取函数引用(使用 eval 或类似的东西)而不是相反。

2011-10-25 08:56:42
stackoverflow用户513763
stackoverflow用户513763

无法获取函数名称

没有这样的函数。我猜不存在这样的函数,因为函数是一等公民。因此,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) --返回fun指向的表t中的函数名称
   for k,v in pairs(t) do
       if v==fun then return k end
   end
end
print(NameOfFunctionIn(a,t)) -- 在t中打印a
print(NameOfFunctionIn(b,t)) -- 在t中打印c
print(NameOfFunctionIn(b,_G)) -- 在全局表中打印b,因为全局表中的b就是b。其实这里有点没什么用。

另一种方法是将函数包装在一个表中,并设置一个元表来调用该函数,如下所示:

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) --或print(tostring(fun1))

这将比使用裸函数慢一些,因为需要元表查找。这也无法防止任何人改变函数在状态中的名称,改变包含它的表中的函数名称,改变函数本身等等,因此不是不可篡改的。你还可以像 fun1.fun 一样只通过索引访问表,这在将其导出为模块时可能会很好,但会导致元表失去名称和其他技巧。

2011-10-25 09:22:50
stackoverflow用户15996
stackoverflow用户15996
技术上讲,这是可能的,这里是export()函数的一个实现:

function export(...) local env = getfenv(2); local funcs = {...}; for i=1, select("#", ...) do local func = funcs[i]; for local_index = 1, math.huge do local local_name, local_value = debug.getlocal(2, local_index); if not local_name then break; end if local_value == func then env[local_name] = local_value; break; end end end return env; end

```

它使用了debug API,需要对Lua 5.2进行一些更改,最后我并不一定认为它是编写模块的好方法,我只是简单地回答问题。

2011-10-30 00:12:21