जवाबों:
कुछ चीजें चल रही हैं।
सबसे पहले, स्काला डॉट्स और परेंस को कई विधि कॉलों से छोड़े जाने की अनुमति देता है, इसलिए 20 seconds
इसके बराबर है20.seconds()
* के ।
दूसरा, एक "निहित रूपांतरण" लागू होता है। चूंकि 20
एक विधि नहीं है Int
और संकलक एक अंतर्निहित रूपांतरण की खोज करता है जो एक तरीका लेता है और एक ऐसी चीज देता है जिसमें एक विधि होती है, जिसमें आपके विधि कॉल के दायरे से विवश खोज होती है।Int
seconds
Int
seconds
आपने 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
लेकिन वास्तव में DurationConversions
Trait आयात नहीं करता है? संपादित करें : बस एहसास हुआ कि वे वास्तव में क्या आयात कर रहे हैं DurationInt
। मैं यह अनुमान लगा रहा हूं क्योंकि आप वास्तविक विशेषता को आयात नहीं कर सकते हैं? केवल Trait का एक ठोस कार्यान्वयन?