Po prostu nie ma takiej funkcji. Chyba nie ma takiej funkcji, ponieważ funkcje są obywatelami pierwszej klasy. Tak więc funkcja jest po prostu wartością jak każda inna, do której odwołuje się zmienna. Stąd funkcja NAME_OF_FUNCTION
nie byłaby bardzo przydatna, ponieważ ta sama funkcja może mieć wiele zmiennych wskazujących na to, lub żadna.
Można emulować jedną dla funkcji globalnych lub funkcji w tabeli, przechodząc przez tabelę (arbitralne lub _G), sprawdzając, czy wartość jest równa x. Jeśli tak, to znalazłeś nazwę funkcji.
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.
Innym rozwiązaniem byłoby zawinąć funkcji w tabeli i mają metatable założyć, że wywołuje funkcję, na przykład:
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))
To będzie nieco wolniejsze niż przy użyciu gołych funkcje ponieważ z metatable wyszukiwania. Nie uniemożliwi to nikomu zmiany nazwy funkcji w stanie, zmiany nazwy funkcji w tabeli zawierającej ją, zmiany funkcji itp., Więc nie jest to zabezpieczeniem przed manipulacją. Można również usunąć tabele po indeksowaniu, takie jak fun1.fun
, które mogą być dobre, jeśli wyeksportujesz je jako moduł, ale tracisz nazewnictwo i inne sztuczki, które możesz umieścić w metatable.
Mogę po prostu przekazać ciąg, aby wyeksportować siebie, ale pomyślałem, że zapytam, ponieważ myślę, że jest bardziej elegancki, przechodząc przez samą funkcję. Chociaż jest to zbyt trudne, ponieważ nazwa jak w źródle żyje tylko w źródle. – Paralife
Myślę, że mylisz się w tym miejscu "nazwa jak w źródle żyje tylko w źródle". Dotyczy to większości języków statycznych i kompilowanych, ale języki dynamiczne/języki skryptowe wywołują funkcje, wyszukując ich nazwy, dzięki czemu mogą mieć późniejsze wiązanie (i pozwalają na ponowne wiązanie funkcji z małpiącym kodem poprawki, itd.). – fortran
możliwy duplikat [ Stringify nazwa obiektu w Lua] (http://stackoverflow.com/questions/6800648/stringify-object-name-in-lua) – finnw