2013-02-27 21 views

उत्तर

132

कुछ चीजें चल रही हैं।

पहला, स्कैला कई विधि कॉल से डॉट्स और पैरों को छोड़ा जा सकता है, इसलिए 20 seconds20.seconds() * के बराबर है।

दूसरा, एक "निहित रूपांतरण" लागू होता है। चूंकि 20 एक Int है और Int कोई seconds विधि, एक अंतर्निहित रूपांतरण है कि खोज अपने विधि कॉल के दायरे से विवश साथ एक Int लेता है और कुछ है कि करता एक seconds विधि देता है, के लिए संकलक खोज है।

आपने अपने दायरे में DurationInt आयात किया है। चूंकि DurationIntInt पैरामीटर के साथ एक निहित वर्ग है, इसके निर्माता ने एक अंतर्निहित Int => DurationInt रूपांतरण परिभाषित किया है। DurationInt में seconds विधि है, इसलिए यह सभी खोज मानदंडों को पूरा करता है। इसलिए, कंपाइलर आपकी कॉल को new DurationInt(20).seconds ** के रूप में पुनः लिखता है।

* मेरा मतलब यह ढीला है। 20.seconds() वास्तव में अमान्य है क्योंकि seconds विधि में कोई पैरामीटर सूची नहीं है और इसलिए माता-पिता को विधि कॉल पर छोड़ा जाना चाहिए।

** असल में, यह सच नहीं है क्योंकि DurationInt एक मान वर्ग है, इसलिए संकलक पूर्ण होने पर पूर्णांक को लपेटने से बचेंगे।

+66

कोई भी पर्याप्त उन्नत तकनीक जादू से अलग नहीं है। – ripper234

+4

सौभाग्य से अधिकांश आईडीई इसे अलग करने में सक्षम हैं! स्कैला में लागू रूपांतरणों का काफी उपयोग किया जाता है। यदि आप केवल टेक्स्ट फ़ाइल पढ़ रहे हैं, तो यह भ्रमित हो सकता है ("वह विधि कहां से आती है") लेकिन उचित टूल समर्थन के साथ आपको अपना रास्ता ढूंढने में सक्षम होना चाहिए, जिस समय स्काला खूबसूरती से सार्थक और संक्षिप्त हो सकता है। (उदाहरण के लिए, 20. सेकंड्स 'नई अवधि INT (20) .seconds()' से बहुत अधिक पठनीय है, जब तक आप जानते हैं कि यह कैसे करता है) –

+1

यदि आप खुद को implicits का उपयोग करके पाते हैं, तो हमेशा पूछें कि क्या कोई तरीका है उनकी मदद के बिना एक ही चीज़ प्राप्त करें। http://twitter.github.com/effectivescala/# टाइप और जेनेरिक-इम्प्लिकिट्स – oluies

6

"जादू" जो वहां जा रहा है उसे "निहित रूपांतरण" कहा जाता है। आप निहित रूपांतरण आयात कर रहे हैं, और उनमें से कुछ Int (और Double) से अवधि के बीच रूपांतरण को संभालते हैं। यही वह है जिसके साथ आप काम कर रहे हैं।

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