scala स्कैला में '20 सेकंड 'कैसे काम करता है?




duration (2)

निम्नलिखित संकलन कैसे करता है:

import scala.concurrent.duration._

val time = 20 seconds

वास्तव में यहाँ क्या चल रहा है?


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

सबसे पहले, 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 विधि में कोई पैरामीटर सूची नहीं है और इसलिए 20.seconds() को विधि कॉल पर छोड़ा जाना चाहिए।

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


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





duration