जवाबों:
कुछ चीजें चल रही हैं।
सबसे पहले, स्काला डॉट्स और परेंस को कई विधि कॉलों से छोड़े जाने की अनुमति देता है, इसलिए 20 secondsइसके बराबर है20.seconds() * के ।
दूसरा, एक "निहित रूपांतरण" लागू होता है। चूंकि 20एक विधि नहीं है Intऔर संकलक एक अंतर्निहित रूपांतरण की खोज करता है जो एक तरीका लेता है और एक ऐसी चीज देता है जिसमें एक विधि होती है, जिसमें आपके विधि कॉल के दायरे से विवश खोज होती है।IntsecondsIntseconds
आपने DurationInt को अपने दायरे में आयात किया है। चूंकि पैरामीटर के DurationIntसाथ एक अंतर्निहित वर्ग होता है Int, इसके निर्माता एक अंतर्निहित Int => DurationIntरूपांतरण को परिभाषित करता है । DurationIntएक secondsतरीका है, इसलिए यह सभी खोज मानदंडों को संतुष्ट करता है। इसलिए, कंपाइलर आपके कॉल को new DurationInt(20).seconds** के रूप में फिर से लिखता है ।
* मेरा मतलब यह शिथिल है। 20.seconds()वास्तव में अमान्य है क्योंकि secondsविधि में कोई पैरामीटर सूची नहीं है और इसलिए Parens होना चाहिए विधि कॉल पर छोड़ा चाहिए।
** वास्तव में, यह काफी सही नहीं है क्योंकि DurationIntमूल्य वर्ग है, इसलिए यदि संभव हो तो कंपाइलर पूर्णांक को लपेटने से बच जाएगा।
new DurationInt(20).seconds()इतने लंबे समय से अधिक पठनीय है जब तक आप जानते हैं कि यह कैसे होता है)
secondsविधि को बिना पराये के परिभाषित किया जाता है, इसलिए इसे पारेंस के साथ बुलाना एक त्रुटि है।
20.seconds()स्काला में लिख सकते हैं , केवल यह है कि कंपाइलर उस तरह से कॉल का अनुवाद कर रहा है। यह की कीमत उनका कहना है कि स्काला की आवश्यकता है , तो इसी विधि, कोई पैरामीटर सूची है कि इस मामले में कोष्ठक छोड़ आप।
वहां होने वाले "जादू" को "निहित रूपांतरण" कहा जाता है। आप निहित रूपांतरणों को आयात कर रहे हैं, और उनमें से कुछ इंट (और डबल) के बीच के रूपांतरण को अवधि तक संभालते हैं। यही आप के साथ काम कर रहे हैं।
import scala.concurrent.duration._हल करता है, 20 secondsलेकिन वास्तव में DurationConversionsTrait आयात नहीं करता है? संपादित करें : बस एहसास हुआ कि वे वास्तव में क्या आयात कर रहे हैं DurationInt। मैं यह अनुमान लगा रहा हूं क्योंकि आप वास्तविक विशेषता को आयात नहीं कर सकते हैं? केवल Trait का एक ठोस कार्यान्वयन?