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


130

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

import scala.concurrent.duration._

val time = 20 seconds

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

जवाबों:


171

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

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

दूसरा, एक "निहित रूपांतरण" लागू होता है। चूंकि 20एक विधि नहीं है Intऔर संकलक एक अंतर्निहित रूपांतरण की खोज करता है जो एक तरीका लेता है और एक ऐसी चीज देता है जिसमें एक विधि होती है, जिसमें आपके विधि कॉल के दायरे से विवश खोज होती है।IntsecondsIntseconds

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

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

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


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

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

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

4
वास्तव में secondsविधि को बिना पराये के परिभाषित किया जाता है, इसलिए इसे पारेंस के साथ बुलाना एक त्रुटि है।
फ्रैंक एस। थॉमस

1
@Frank यह एक अच्छी बात है। मुझे यह सुझाव देने का मतलब नहीं था कि आप 20.seconds()स्काला में लिख सकते हैं , केवल यह है कि कंपाइलर उस तरह से कॉल का अनुवाद कर रहा है। यह की कीमत उनका कहना है कि स्काला की आवश्यकता है , तो इसी विधि, कोई पैरामीटर सूची है कि इस मामले में कोष्ठक छोड़ आप।
एरोन नोवस्त्रुप

7

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


1
किसी भी विचार क्यों आयात import scala.concurrent.duration._हल करता है, 20 secondsलेकिन वास्तव में DurationConversionsTrait आयात नहीं करता है? संपादित करें : बस एहसास हुआ कि वे वास्तव में क्या आयात कर रहे हैं DurationInt। मैं यह अनुमान लगा रहा हूं क्योंकि आप वास्तविक विशेषता को आयात नहीं कर सकते हैं? केवल Trait का एक ठोस कार्यान्वयन?
फ्रैंकलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.