Simplemente no existe tal función. Supongo que no existe tal función, ya que las funciones son ciudadanos de primera clase. Entonces, una función es solo un valor como cualquier otro, al que se hace referencia por variable. Por lo tanto, la función NAME_OF_FUNCTION
no sería muy útil, ya que la misma función puede tener muchas variables apuntando a ella, o ninguna.
Puede emular uno para funciones globales, o funciones en una tabla al recorrer la tabla (arbitraria o _G), verificando si el valor es igual a x. Si es así, has encontrado el nombre de la función.
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.
Otro enfoque sería para envolver funciones en una mesa, y tienen un metatabla estableció que llama a la función, así:
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))
Este será un poco más lento que el uso de funciones descubiertos porque de la búsqueda metatable Y no impedirá que nadie cambie el nombre de la función en el estado, cambie el nombre de la función en la tabla que lo contiene, cambie la función, etc., para que no sea a prueba de manipulaciones. También podría quitar las tablas simplemente indexando como fun1.fun
, lo que podría ser bueno si lo exporta como un módulo, pero pierde los nombres y otros trucos que podría poner en la metatabla.
Podría pasar el hilo para exportarme, pero pensé en preguntar porque creo que es más elegante pasar el mismo func. Aunque es muy difícil de tener, ya que el nombre tal como está en la fuente solo vive en la fuente. – Paralife
Creo que se equivoca en este punto 'el nombre tal como está en la fuente vive solo en la fuente'. Eso es cierto para la mayoría de los lenguajes estáticos y compilados, pero los lenguajes dinámicos/de scripts envían las funciones buscando sus nombres, por lo que pueden tener un enlace tardío (y permitir volver a vincular funciones al código de parche mono, etc.) – fortran
posible duplicado de [ Nombre del objeto Stringify en Lua] (http://stackoverflow.com/questions/6800648/stringify-object-name-in-lua) – finnw