कैसे निम्नलिखित संकलन करता है:स्कैला में '20 सेकंड 'कैसे काम करता है?
import scala.concurrent.duration._
val time = 20 seconds
क्या वास्तव में यहाँ पर जा रहा है?
कैसे निम्नलिखित संकलन करता है:स्कैला में '20 सेकंड 'कैसे काम करता है?
import scala.concurrent.duration._
val time = 20 seconds
क्या वास्तव में यहाँ पर जा रहा है?
कुछ चीजें चल रही हैं।
पहला, स्कैला कई विधि कॉल से डॉट्स और पैरों को छोड़ा जा सकता है, इसलिए 20 seconds
20.seconds()
* के बराबर है।
दूसरा, एक "निहित रूपांतरण" लागू होता है। चूंकि 20
एक Int
है और Int
कोई seconds
विधि, एक अंतर्निहित रूपांतरण है कि खोज अपने विधि कॉल के दायरे से विवश साथ एक Int
लेता है और कुछ है कि करता एक seconds
विधि देता है, के लिए संकलक खोज है।
आपने अपने दायरे में DurationInt आयात किया है। चूंकि DurationInt
Int
पैरामीटर के साथ एक निहित वर्ग है, इसके निर्माता ने एक अंतर्निहित Int => DurationInt
रूपांतरण परिभाषित किया है। DurationInt
में seconds
विधि है, इसलिए यह सभी खोज मानदंडों को पूरा करता है। इसलिए, कंपाइलर आपकी कॉल को new DurationInt(20).seconds
** के रूप में पुनः लिखता है।
* मेरा मतलब यह ढीला है। 20.seconds()
वास्तव में अमान्य है क्योंकि seconds
विधि में कोई पैरामीटर सूची नहीं है और इसलिए माता-पिता को विधि कॉल पर छोड़ा जाना चाहिए।
** असल में, यह सच नहीं है क्योंकि DurationInt
एक मान वर्ग है, इसलिए संकलक पूर्ण होने पर पूर्णांक को लपेटने से बचेंगे।
"जादू" जो वहां जा रहा है उसे "निहित रूपांतरण" कहा जाता है। आप निहित रूपांतरण आयात कर रहे हैं, और उनमें से कुछ Int (और Double) से अवधि के बीच रूपांतरण को संभालते हैं। यही वह है जिसके साथ आप काम कर रहे हैं।
कोई भी पर्याप्त उन्नत तकनीक जादू से अलग नहीं है। – ripper234
सौभाग्य से अधिकांश आईडीई इसे अलग करने में सक्षम हैं! स्कैला में लागू रूपांतरणों का काफी उपयोग किया जाता है। यदि आप केवल टेक्स्ट फ़ाइल पढ़ रहे हैं, तो यह भ्रमित हो सकता है ("वह विधि कहां से आती है") लेकिन उचित टूल समर्थन के साथ आपको अपना रास्ता ढूंढने में सक्षम होना चाहिए, जिस समय स्काला खूबसूरती से सार्थक और संक्षिप्त हो सकता है। (उदाहरण के लिए, 20. सेकंड्स 'नई अवधि INT (20) .seconds()' से बहुत अधिक पठनीय है, जब तक आप जानते हैं कि यह कैसे करता है) –
यदि आप खुद को implicits का उपयोग करके पाते हैं, तो हमेशा पूछें कि क्या कोई तरीका है उनकी मदद के बिना एक ही चीज़ प्राप्त करें। http://twitter.github.com/effectivescala/# टाइप और जेनेरिक-इम्प्लिकिट्स – oluies