मैं एक विशेषता लिखने की कोशिश कर रहा हूं (स्कैला 2.8 में) जिसे एक केस क्लास में मिश्रित किया जा सकता है, जिससे किसी विशेष डीबगिंग उद्देश्य के लिए रनटाइम पर अपने क्षेत्रों का निरीक्षण किया जा सकता है। मैं उन्हें क्रम में वापस प्राप्त करना चाहता हूं कि उन्हें स्रोत फ़ाइल में घोषित किया गया था, और मैं केस क्लास के अंदर किसी भी अन्य फ़ील्ड को छोड़ना चाहता हूं। उदाहरण के लिए:स्कैला केस क्लास पर प्रतिबिंब
trait CaseClassReflector extends Product {
def getFields: List[(String, Any)] = {
var fieldValueToName: Map[Any, String] = Map()
for (field <- getClass.getDeclaredFields) {
field.setAccessible(true)
fieldValueToName += (field.get(this) -> field.getName)
}
productIterator.toList map { value => fieldValueToName(value) -> value }
}
}
case class Colour(red: Int, green: Int, blue: Int) extends CaseClassReflector {
val other: Int = 42
}
scala> val c = Colour(234, 123, 23)
c: Colour = Colour(234,123,23)
scala> val fields = c.getFields
fields: List[(String, Any)] = List((red,234), (green,123), (blue,23))
उपरोक्त क्रियान्वयन स्पष्ट रूप से त्रुटिपूर्ण है क्योंकि यह उत्पाद में एक क्षेत्र की स्थिति और उन मैदान पर मूल्य की समानता से इसके नाम के बीच संबंध का अनुमान लगाता है, ताकि निम्नलिखित, कहते हैं, काम नहीं करेगा :
Colour(0, 0, 0).getFields
क्या इसका कोई तरीका लागू किया जा सकता है?
वहाँ अपने कोड में एक बग है उदाहरण के आधार पर एक छोटी और काम संस्करण है,। मान अद्वितीय नहीं हैं, और इसलिए आप (फ़ील्ड.get (यह) -> field.getName) के साथ मानों को ओवरराइट करने जा रहे हैं, जब एक फ़ील्ड से आगे बढ़ते हैं तो नाम दिया जाता है। नीचे दिए गए कोड का एक पुनः लिखित संस्करण देखें। –
@ SagieDavidovich वास्तव में, जैसा कि उल्लेख किया गया है, "उपर्युक्त कार्यान्वयन स्पष्ट रूप से त्रुटिपूर्ण है" –