scala - चर को शाब्दिक या चर बताते हुए स्काला व्यवहार




char int (2)

स्काला में, अगर मेरे पास एक वैरिएबल घोषणा है, जैसे

var x: Char = 'a'

अगर मैं 1 को जोड़कर इस वर्ण को अपडेट करने और अपडेट कर रहा हूं, जैसे

x = x + 1

मुझे एक संकलन त्रुटि मिलती है: प्रकार बेमेल, पाया गया Int आवश्यक चार हालांकि, मैं यह संकलन त्रुटि के बिना कर सकता हूँ:

x = 'a' + 1

मैं अनुमान लगा रहा हूं कि वास्तविक मूल्य बनाम वस्तुओं के साथ ऐसा करने के लिए कुछ है, हालांकि, मैं सटीक व्यवहार के आसपास मेरे सिर को प्राप्त करने की कोशिश कर रहा हूं। आप स्पष्ट रूप से एक वर्ण को एक शाब्दिक पूर्णांक असाइन कर सकते हैं, उदाहरण के लिए 97, और आप 97-32 के परिणाम भी निर्दिष्ट कर सकते हैं। लेकिन अगर मैं कहूंगा 97-32 + 5 तो मुझे एक प्रकार की बेमेल त्रुटि मिलती है किस बिंदु पर कंपाइलर एक अभिव्यक्ति के बीच भेद करता है जो परिणामस्वरूप एक वास्तविक वि एक होता है जिसके परिणामस्वरूप एक ऑब्जेक्ट होता है?


असाइनमेंट कुंजी यहाँ है निम्नलिखित आरईपीएल सत्र देखें:

alex@POSITRON ~ $ scala
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val x:Char = 'a'
x: Char = a

scala> x + 1
res0: Int = 98

scala> var y:Char = 'a'
y: Char = a

scala> y + 1
res1: Int = 98

scala> y = y + 1
<console>:8: error: type mismatch;
 found   : Int
 required: Char
       y = y + 1
             ^

scala> 

इसलिए जब तक आप चर वैरिएबल के मूल्यों को पुन: असाइन करने की कोशिश नहीं करते, तब तक आप सभी देख सकते हैं। जब आप 'a'+1 या x + 1 लिखते हैं तो इसे Int बदल जाता है। इसलिए जब आप अंततः x = x + 1 पुन: असाइन करने की कोशिश करते हैं, तो आप चर में चर को निर्दिष्ट करने का प्रयास कर रहे हैं। यह समझाता है कि संकलन त्रुटि क्यों होती है।

Char सहयोगी वस्तु में वहाँ implicit def char2int(x: Char): Int विधि। मुझे लगता है कि var x:Char = 'a' + 1 पहली बात ये होती है कि 'ए' से 97 में परिवर्तित करने के लिए इस पद्धति का आह्वान किया जाता है। फिर 97 को 1 जोड़ा जाता है, दोनों के रूप में Int एस फिर वैरिएबल x को वही तरीके से शुरु किया जाता है जैसे val y:Char = 98 यह मुझे लगता है कि यह बताता है कि कैसे चर initialization काम करता है


विशिष्ट शब्दावली टाइप करने के लिए विशेष नियम है

हालांकि, यदि अभिव्यक्ति में एक शब्दशः की अपेक्षित प्रकार पीटी या तो बाइट, लघु, या चारार है और पूर्णांक संख्या प्रकार द्वारा परिभाषित संख्यात्मक सीमा में फिट होती है, तो संख्या को पीटी टाइप किया जाता है और शाब्दिक प्रकार पीटी है

इससे आप लिख सकते हैं:

scala> 97 : Char
res0: Char = a

scala> 97 + 1 : Char
res1: Char = b

चुपके से, उनका मतलब निरंतर भाव है। लेकिन निरंतर अभिव्यक्ति की परिभाषा प्लेटफॉर्म-विशिष्ट है, इसलिए तकनीकी तौर पर res1 भी संकलित करने में असफल हो सकता है, अगर यह लगातार-मुड़ा हुआ न हो।

स्कैलाडॉक में लगातार तह के बारे में एक संबंधित प्रश्न स्कैलाडोक के तहत प्रकार की जांच के अजीब नुकसान को दर्शाता है:

$ ~/scala-2.12.3/bin/scaladoc -d /tmp folded.scala
folded.scala:9: error: type mismatch;
 found   : Int
 required: Char
    x = 'a' - 32 + 5
                 ^
model contains 4 documentable templates
one error found






variable-assignment