2010-06-23 17 views
16

मैंक्या स्कैला में फ़ंक्शन के भीतर से फ़ंक्शन का नाम पुनर्प्राप्त करना संभव है?

def getMeASammy() {println "getMeASammy"} 
def getMeADrink() {println "getMeADrink"} 
def getMeASub() {println "getMeASub"} 

की तरह कुछ करना चाहते हैं लेकिन, मुझे स्पष्ट रूप से समारोह का नाम टाइप करने के लिए नहीं करना चाहती।

+1

आप विषय विनम्र कंपनी में उल्लेख किया जाना चाहिए ... –

+0

मैं स्काला के बारे में कुछ भी नहीं पता पर स्टैक ट्रेस नहीं, बल्कि अधिक उपयोग कर सकते हैं, लेकिन आप इस के लिए जावा प्रतिबिंब एपीआई का उपयोग नहीं कर सकता है? उदाहरण देखें [क्या स्कैला में पाइथन के डीआईआर() के समान कुछ करने में आत्मनिरीक्षण है? (Http://stackoverflow.com/questions/1973202/does-scala-have-introspection-capable-of-something-similar-to-pythons-dir) –

+1

जब कोई आपको अपना नाम पूछता है, तो क्या आप अपना वॉलेट निकालते हैं और जवाब देने के लिए अपनी आईडी में से एक को चेक करते हैं? –

उत्तर

28
scala> def currentMethodName() : String = Thread.currentThread.getStackTrace()(2).getMethodName 
currentMethodName:()String 

scala> def getMeASammy() = { println(currentMethodName()) } 
getMeASammy:()Unit 

scala> getMeASammy() 
getMeASammy 
+1

मुझे लगता है कि अगर आप getStackTrace() (3) प्राप्त करते हैं तो आपको इसे कॉल करने वाला फ़ंक्शन मिलता है? – Zuoanqh

+0

@Zuoanqh यह सही है। –

+0

सूचकांक (2) या (3) कभी असफल हो जाएंगे? पूर्व। क्या मुझे एक शून्य जांच करनी चाहिए? – Raymond26

4

यह कुछ हद तक बगावत है, लेकिन JVM से वर्तमान पद्धति के नाम प्राप्त करने का एकमात्र तरीका समर्थित एक अपवाद (लेकिन यह नहीं फेंक) बनाने के लिए, और फिर अपवाद के ढेर से बाहर विधि नाम पढ़ा है का पता लगाने।

def methodName:String= new Exception().getStackTrace().apply(1).getMethodName() 
+1

का उपयोग करना सुरक्षित है। अपवाद बनाने के लिए आवश्यक नहीं है। ऊपर मेरा जवाब देखें, जो 'Thread.getStackTrace()' का उपयोग करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे