Böyle bir işlev yoktur. İşlevler birinci sınıf vatandaşlar olduğu için böyle bir işlev yok sanırım. Yani bir işlev, değişken tarafından atıfta bulunulan, diğerleri gibi bir değerdir. Bu nedenle, NAME_OF_FUNCTION
işlevinin işlevi çok kullanışlı olmaz; çünkü aynı işlevin ona işaret eden çok sayıda değişkeni olabilir veya hiç yoktur.
Genel işlevler veya tablodaki işlevler için (isteğe bağlı veya _G), değerin x değerine eşit olup olmadığını kontrol ederek bir tablodaki işlevleri taklit edebilirsiniz. Eğer öyleyse fonksiyon ismini buldunuz.
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))
Bu çıplak işlevleri nedeniyle kullanarak biraz daha yavaş olacaktır:
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.
başka bir yaklaşım, bir tablodaki işlevleri kaydırmak ve MetaTable böyle, işlevini çağırır kurmak zorunda olacaktır Metatable arama. Ve herhangi bir kişinin durumdaki ismin ismini değiştirmesini, onu içeren tablodaki işlevin adını değiştirmesini, işlevi değiştirmeyi, vb. Tabloyu, bir modül olarak dışa aktarırsanız iyi olabilen fun1.fun
gibi dizinleri de bölebilirdiniz, ancak metata ekleyebileceğiniz ad ve diğer hileleri kaybedersiniz.
Sadece kendim dışa aktarmak için dizgeyi geçebilirdim, ama sorduğumu düşündüm çünkü func'in kendisinden daha zarif olduğunu düşünüyorum. Kaynağında olduğu gibi isminden beri çok zor olmasına rağmen, sadece kaynakta yaşar. – Paralife
Bence bu noktada yanılıyorsunuz 'kaynakta olduğu gibi sadece kaynakta yaşıyor '. Bu, çoğu statik ve derlenmiş diller için geçerlidir, ancak dinamik/komut dosyası dilleri isimlerini arayarak işlevleri gönderir, böylece geç bağlama yapabilirler (ve maymun yama koduna vb. Işlevlerini yeniden eklemelerine izin verebilirler) – fortran
olası bir kopyası [ Lua'daki nesne ismini dizginle] (http://stackoverflow.com/questions/6800648/stringify-object-name-in-lua) – finnw