2017-02-18 13 views
15

तो मैं स्काला सीख रहा हूँ और मैं इस नकचढ़ा मुद्दा में आए नहीं ले करता है ...स्काला स्ट्रिंग toInt - इंट मापदंडों

अगर हम एक String है और यह एक Int को परिवर्तित करना चाहते हैं, सभी उदाहरण है कि मैं ऑनलाइन पाया गया है, "यह इतना आसान है! बस String.toInt का उपयोग करें!"

ठीक है:

var x = readLine().toInt 

सरल पर्याप्त। मुझे लगता है कि toIntString का एक कार्य है। लेकिन अगर ऐसा है, तो मुझे toInt को ब्रांड्स के साथ कॉल करने में सक्षम होना चाहिए, है ना? जावा से आ रहा है, यह मेरे लिए अधिक प्राकृतिक लगता है:

var x = readLine().toInt() 

लेकिन हां! स्कैला मुझे निम्नलिखित त्रुटि देता है:

[error] /home/myhome/code/whatever/hello.scala:13: Int does not take parameters

[error] var x = readLine().toInt()

उत्सुक। इस त्रुटि का मतलब क्या है? toIntString का कोई फ़ंक्शन नहीं है? इसी तरह, मैं दोनों क्यों कर सकता हूं:

var x = readLine().toLowerCase() 
var y = readLine().toLowerCase 

किसी भी समस्या के साथ?

संपादित करें: डुप्लिकेट प्रश्न toLowerCase बनाम toInt मुद्दे के समाधान नहीं करता है।

+0

संभावित डुप्लिकेट [डिफ़ॉल्ट foo = {} और def foo() = {} के बीच अंतर क्या है?] (Http://stackoverflow.com/questions/7409502/what-is-the-difference- बीच-डीफ-फू-एंड-डीफ-फू-इन-स्कैला) –

उत्तर

19

यह एक अच्छा सवाल है, और मुझे नहीं लगता कि यह question about defining zero-arity methods के साथ या बिना ब्रांड्स के डुप्लिकेट के रूप में गिना जाता है।

toInt और toLowerCase यहाँ के बीच अंतर यह है कि toInt एक वाक्यात्मक मानक लाइब्रेरी की StringOps वर्ग द्वारा प्रदान संवर्धन है। आप आरईपीएल में reify और showCode का उपयोग करके यह देख सकते हैं:

scala> import scala.reflect.runtime.universe.{ reify, showCode } 
import scala.reflect.runtime.universe.{reify, showCode} 

scala> showCode(reify("1".toInt).tree) 
res0: String = Predef.augmentString("1").toInt 

यह सिर्फ संवर्धन विधि कॉल desugars और क्या निहित रूपांतरण यह समर्थन करने के लिए लागू किया गया है आपको पता चलता है।

यदि हम toInt method on StringOps पर देखते हैं, तो हम देखते हैं कि यह बिना किसी ब्रांड्स के परिभाषित किया गया है। चूंकि संभावित डुप्लिकेट प्रश्न का उत्तर बताता है, यदि स्कैला में शून्य-धर्मार्थ विधि को कोष्ठक के बिना परिभाषित किया गया है, तो इसे कोष्ठक के साथ नहीं कहा जा सकता है (हालांकि यदि इसे कोष्ठक के साथ परिभाषित किया गया है तो इसे किसी भी तरह से कहा जा सकता है)।

इसलिए यही कारण है कि "1".toInt() काम नहीं करता है। यदि String सामान्य स्कैला नामकरण सम्मेलनों के बाद सामान्य स्कैला वर्ग थे, "ABC".toLowerCase() या तो काम नहीं करेगा, क्योंकि विधि को बिना किसी प्रभाव के परिभाषित किया जाएगा, क्योंकि यह दुष्प्रभाव नहीं है (यह केवल एक सम्मेलन है, लेकिन यह काफी लगातार लागू होता है स्कैला कोड में)।

समस्या यह है कि String वास्तव में स्कैला मानक पुस्तकालय में एक वर्ग नहीं है-यह केवल java.lang.String है। जेवीएम स्तर पर, कोष्ठक के साथ परिभाषित शून्य-धर्मार्थ विधि और कोष्ठक के बिना परिभाषित एक शून्य-धैर्य विधि के बीच कोई अंतर नहीं है- यह पूरी तरह से एक स्केल भेद है, और यह JVM विधि हस्ताक्षर में एन्कोड नहीं किया गया है, लेकिन मेटाडेटा के एक अलग बैच में संग्रहीत है कक्षा फाइल

स्कैला भाषा डिजाइनरों ने स्काला में परिभाषित सभी शून्य-धर्मार्थ विधियों का इलाज करने का निर्णय लिया (और इसलिए यह अतिरिक्त मेटाडाटा नहीं है) जैसे कि उन्हें कोष्ठक के साथ परिभाषित किया गया था। चूंकि toLowerCaseString पर विधि वास्तव में और वास्तव में java.lang.String वर्ग (toInt जैसी वाक्य रचनात्मक संवर्द्धन विधि) की विधि है, यह इस श्रेणी में आती है, जिसका अर्थ है कि आप इसे किसी भी तरह से कॉल कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। तो मेरी समझ में अंतर को पुल करने के लिए, शून्य-धर्मार्थ विधि एक विधि है जिसे बिना किसी ब्रांड्स के परिभाषित किया जाता है और ये केवल सम्मेलन द्वारा ही होते हैं (यानी मैं ऐसी विधि को परिभाषित कर सकता हूं जो इसे अधिक जावा-जैसी बनाने के लिए ब्रांड्स के साथ कोई तर्क नहीं लेता)? तो मैं एक शून्य-धैर्य विधि कहूंगा जैसे कि मैं एक क्षेत्र तक पहुंच रहा था? और यदि मैं जावा कक्षाओं/पुस्तकालयों का उपयोग करता हूं, तो शून्य-धर्मार्थ विधियों जैसी कोई चीज़ नहीं है? इसके अलावा, "साइड-इफेक्टिंग" विधि क्या है? –

+0

@ केनेथवॉर्डन मैं किसी भी विधि को संदर्भित करने के लिए "शून्य-arity" का उपयोग कर रहा हूं जो तर्क नहीं लेता है, चाहे वह कोष्ठक के साथ या बिना परिभाषित किया गया हो। जावा में ऐसे विधियां हैं जो तर्क नहीं लेती हैं (और इस अर्थ में शून्य-धैर्य के रूप में गिनती हैं), लेकिन यह इनके बीच अंतर नहीं है कि वे कोष्ठक के साथ परिभाषित किया गया है या नहीं (जावा सिंटैक्स के मामले में, वे सभी हैं)। –

+0

और "साइड-इफेक्टिंग" का अर्थ है कि यह गणितीय अर्थ में कोई फ़ंक्शन नहीं है- यह कुछ प्रिंट कर सकता है, बाद के कॉल आदि पर विभिन्न मान वापस कर सकता है। –

संबंधित मुद्दे