मान लीजिए कि मैं कोड को लपेटना चाहता हूं जो अपवाद को लॉग इन करने वाले प्रयास-चिह्न ब्लॉक के साथ अपवाद फेंक सकता है और जारी रहता है। की तरह कुछ:क्या स्कैला में अंतर्निहित पैरामीटर के रूप में "यह" पास करना संभव है?
loggingExceptions {
// something dangerous
}
आदर्श रूप में, मैं, लॉगर बुला वस्तु पर परिभाषित प्रवेश करने के लिए उपयोग करना चाहते हैं, यदि कोई हो (और कोई नहीं, एक संकलन समय त्रुटि मिलती है)। मैं कुछ इस तरह परिभाषित करने के लिए खुशी होगी:
def loggingExceptions[L <: { def logger: Logger }](work: => Unit)(implicit objectWithLogger: L): Unit = {
try {
work
} catch {
case t: Exception => objectWithLogger.logger.error(t.getMessage)
}
}
जहां objectWithLogger किसी भी तरह "जादुई" से "इस" ग्राहक में कोड का विस्तार होगा। क्या यह (या एक समान चीज़) संभव है?
+1। यह _can_ किया जाना चाहिए, लेकिन यह अव्यवस्थित है। यह लॉगिंग चिंता के साथ-साथ लॉगिंग विशेषता को अलग नहीं करता है, इसके लिए "अंतर्निहित जादू" की आवश्यकता होती है, और अनावश्यक संकलन-समय (अंतर्निहित खोज) और रन-टाइम (प्रतिबिंब) ओवरहेड होता है। कार्यान्वयन इस तथ्य को छुपाता है कि अंतर्निहित रूपांतरण को दायरे में होना चाहिए, और अधिक यथार्थवादी कोडेबेस में इसे क्लाइंट कोड में आयात विवरण की आवश्यकता होगी। –
नकारात्मकों की आपकी सूची "मैं एक अलग समस्या को हल करने की बजाय" बताती हूं। खैर हाँ, हम सब नहीं करेंगे। – extempore
वास्तव में नहीं। मौलिक समस्या उस वर्ग के भीतर कोड के ब्लॉक में अपवाद लॉगिंग कर रही है जिसमें लॉगजर है। आप उस समस्या को हल कर सकते हैं जिस तरह ओपी ने मूल रूप से कल्पना की थी (implicits के साथ), या आप इसे एक विशेषता के साथ और अधिक हल कर सकते हैं। –