दिलचस्प पोस्ट
शून्य मुख्य और इंट मुख्य के बीच का अंतर? एक बटन के अंदर लिंक फ़ायरफ़ॉक्स में काम नहीं कर रहा है मुद्रा मूल्यों को सी ++ में संग्रहीत करने का सर्वोत्तम तरीका नोड.जेएस में समानांतर निष्पादन समन्वयित करना क्यों getchar () कंसोल पर EOF के रूप में वापस पहचान नहीं करता है? PHP: एक सरणी से एक तत्व को हटा दें क्या एक तत्व पर घुमना और एक अलग तत्व को प्रभावित करने का कोई तरीका है? माइग्रेशन: लार्वेल में विदेशी कुंजी बाधा नहीं जोड़ सकते जावा में एक .txt फ़ाइल को संशोधित करें क्यों गिट कहते हैं "खींचो संभव नहीं है क्योंकि आपने फ़ाइलें अनारोल्ड कर दी हैं"? सेलेनियम को वेब चालक का उपयोग कर अस्थायी फ़ायरफ़ॉक्स प्रोफाइल बनाने से कैसे रोकें? कैसे एक तत्व के सूचक को एक int सरणी में खोजने के लिए? IPhone में स्थितिबार पर दृश्य जोड़ना HTTP शीर्षकों के लिए UTF8 फ़ाइल नाम को कैसे एन्कोड करना है? (पायथन, डीजांगो) सत्र.आबंदन () और सत्र के बीच अंतर क्या है। क्लीयर ()

डीएपी, वैल और स्केला में वैर का इस्तेमाल

class Person(val name:String,var age:Int ) def person = new Person("Kumar",12) person.age = 20 println(person.age) 

कोड की ये लाइनें 12 के आउटपुट हैं, भले ही person.age=20 को सफलतापूर्वक निष्पादित किया गया। मैंने पाया कि यह इसलिए होता है क्योंकि मैं def person = new Person("Kumar",12) में def person = new Person("Kumar",12) उपयोग किया था। यदि मैं var या val का उपयोग करता हूँ तो 20 मैं समझता हूं कि डिफ़ॉल्ट में वैल का मूल्य है इस:

 def age = 30 age = 45 

… एक संकलन त्रुटि देता है क्योंकि यह डिफ़ॉल्ट रूप से एक वैल है ऊपर दिए गए पंक्तियों का पहला सेट ठीक से काम क्यों नहीं करता है, और फिर भी त्रुटि नहीं है?

वेब के समाधान से एकत्रित समाधान "डीएपी, वैल और स्केला में वैर का इस्तेमाल"

स्कला में चीजों को परिभाषित करने के तीन तरीके हैं:

  • def एक विधि को परिभाषित करता है
  • val एक निश्चित मान को परिभाषित करता है (जिसे संशोधित नहीं किया जा सकता)
  • var एक चर परिभाषित करता है (जिसे संशोधित किया जा सकता है)

अपने कोड को देखते हुए:

 def person = new Person("Kumar",12) 

यह एक नई विधि परिभाषित करता है जिसे person कहते हैं आप इस विधि को बिना () कॉल कर सकते हैं क्योंकि यह पैरासेलेबल विधि के रूप में परिभाषित किया गया है। खाली-कनान विधि के लिए, आप इसे '()' के साथ या बिना कॉल कर सकते हैं यदि आप बस लिखते हैं:

 person 

तो आप इस विधि को बुला रहे हैं (और यदि आप रिटर्न वैल्यू नहीं देते हैं, तो इसे केवल त्याग दिया जाएगा)। कोड की इस पंक्ति में:

 person.age = 20 

क्या होता है कि आप पहले person विधि को बुलाते हैं, और रिटर्न मूल्य पर (क्लास Person का एक उदाहरण) आप age सदस्य चर को बदल रहे हैं।

और अंतिम पंक्ति:

 println(person.age) 

यहां आप फिर से person विधि को बुला रहे हैं, जो क्लास के किसी Person का नया उदाहरण देता है ( age साथ सेट 12)। यह इस प्रकार है:

 println(person().age) 

मैं भेद से शुरू होता हूँ जो स्काला में def , val और var के बीच मौजूद है I

  • डीईफ़ – सही साइड सामग्री के लिए एक अचल लेबल परिभाषित करता है जो आलसी मूल्यांकन किया जाता है – नाम से मूल्यांकन करें।

  • वैल – सही साइड सामग्री के लिए एक अपरिवर्तनीय लेबल परिभाषित करता है जो उत्सुकतापूर्वक / तुरंत मूल्यांकन किया जाता है – मूल्य द्वारा मूल्यांकन किया गया

  • var – एक अस्थिर चर परिभाषित करता है, शुरू में मूल्यांकन की दाईं ओर की सामग्री पर सेट करता है

उदाहरण, def

 scala> def something = 2 + 3 * 4 something: Int scala> something // now it's evaluated, lazily upon usage res30: Int = 14 

उदाहरण, वैल

 scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition somethingelse: Int = 17 

उदाहरण, var

 scala> var aVariable = 2 * 3 aVariable: Int = 6 scala> aVariable = 5 aVariable: Int = 5 

ऊपर के अनुसार, def और val से लेबल्स को फिर से नियुक्त नहीं किया जा सकता है, और किसी भी प्रयास के मामले में नीचे की तरह एक त्रुटि उठाई जाएगी:

 scala> something = 5 * 6 <console>:8: error: value something_= is not a member of object $iw something = 5 * 6 ^ 

जब वर्ग की तरह परिभाषित किया जाता है:

 scala> class Person(val name: String, var age: Int) defined class Person 

और उसके बाद तत्काल:

 scala> def personA = new Person("Tim", 25) personA: Person 

व्यक्ति के उस विशिष्ट उदाहरण (यानी 'व्यक्ति ए') के लिए एक अपरिवर्तनीय लेबल बनाया गया है जब भी परिवर्तनशील फ़ील्ड 'उम्र' को संशोधित करने की आवश्यकता होती है, तो ऐसा प्रयास विफल हो जाता है:

 scala> personA.age = 44 personA.age: Int = 25 

जैसा कि अपेक्षित, 'उम्र' एक गैर-अयोग्य लेबल का हिस्सा है। इस पर काम करने का सही तरीका में एक अस्थायी चर का प्रयोग किया जाता है, जैसे निम्न उदाहरण में:

 scala> var personB = new Person("Matt", 36) personB: Person = Person@59cd11fe scala> personB.age = 44 personB.age: Int = 44 // value re-assigned, as expected 

के रूप में स्पष्ट, अस्थायी चर संदर्भ (यानी 'personB') से यह वर्ग अस्थिर क्षेत्र 'उम्र' को संशोधित करने के लिए संभव है

मैं अभी भी इस तथ्य पर बल देता हूं कि उपरोक्त उल्लिखित अंतर से सबकुछ आता है, जो किसी स्कला प्रोग्रामर के बारे में स्पष्ट होना चाहिए।

साथ में

 def person = new Person("Kumar", 12) 

आप फ़ंक्शन / आलसी चर परिभाषित कर रहे हैं जो हमेशा "कुमार" और 12 वर्ष के नाम से एक नया व्यक्ति उदाहरण देता है। यह पूरी तरह से वैध है और संकलक को शिकायत करने का कोई कारण नहीं है। कॉलिंग इंटरेक्शन। इस नव निर्मित व्यक्ति उदाहरण की आयु को वापस कर देगा, जो हमेशा 12 है।

लिखते समय

 person.age = 45 

आप क्लास व्यक्ति में आयु संपत्ति के लिए एक नया मान असाइन करते हैं, जो वैध है क्योंकि उम्र को var रूप में घोषित किया जाता है संकलक शिकायत करेगा अगर आप किसी नए व्यक्ति की वस्तु के साथ person को पुन: असाइन करने का प्रयास करते हैं

 person = new Person("Steve", 13) // Error 

एक अन्य परिप्रेक्ष्य प्रदान करने के लिए, स्काला में "डीईएफ़" का अर्थ कुछ ऐसा होता है जिसका प्रयोग हर बार किया जाता है, जबकि वैल कुछ ऐसी चीज है जिसका तुरंत मूल्यांकन किया जाता है और केवल एक बार । यहां, अभिव्यक्ति def person = new Person("Kumar",12) पर जोर देता है कि जब भी हम "व्यक्ति" का उपयोग करते हैं, तो हमें एक new Person("Kumar",12) कॉल प्राप्त होगा। इसलिए यह स्वाभाविक है कि दो "person.age" गैर-संबंधित हैं

मैं स्काला (शायद अधिक "कार्यात्मक" तरीके से) समझता हूं। मुझे यकीन नहीं है कि अगर

 def defines a method val defines a fixed value (which cannot be modified) var defines a variable (which can be modified) 

वास्तव में स्काला का मतलब क्या है हालांकि इसका मतलब है। मुझे वास्तव में ऐसा लगता है कि कम से कम ऐसा नहीं लगता …

जैसा किंटो पहले से ही कहता है, व्यक्ति डीईएफ़ की वजह से एक विधि है और हमेशा एक नया व्यक्ति उदाहरण देता है जैसा कि आपने पाया है कि यदि आप विधि को किसी var या वाल में बदलते हैं, तो यह काम करेगा:

 val person = new Person("Kumar",12) 

एक और संभावना होगी:

 def person = new Person("Kumar",12) val p = person p.age=20 println(p.age) 

हालांकि, आपके कोड में person.age=20 की अनुमति है, जैसा कि आप person तरीकों से किसी Person उदाहरण को वापस प्राप्त करते हैं, और इस उदाहरण पर आपको var के मूल्य को बदलने की अनुमति है समस्या यह है, कि उस पंक्ति के बाद आपके पास इस उदाहरण का कोई और संदर्भ नहीं है (जैसा कि प्रत्येक person को कॉल एक नया उदाहरण देगा)।

यह कुछ खास नहीं है, आपके पास जावा में एक ही व्यवहार होगा:

 class Person{ public int age; private String name; public Person(String name; int age) { this.name = name; this.age = age; } public String name(){ return name; } } public Person person() { return new Person("Kumar", 12); } person().age = 20; System.out.println(person().age); //--> 12 

चलो इसे लें:

 class Person(val name:String,var age:Int ) def person =new Person("Kumar",12) person.age=20 println(person.age) 

और समकक्ष कोड के साथ इसे फिर से लिखना

 class Person(val name:String,var age:Int ) def person =new Person("Kumar",12) (new Person("Kumar", 12)).age_=(20) println((new Person("Kumar", 12)).age) 

देखें, def एक विधि है। यह हर बार जब इसे बुलाया जाता है निष्पादित करेगा, और हर बार वह वापस आ जाएगी (ए) new Person("Kumar", 12) । और ये "असाइनमेंट" में कोई त्रुटि नहीं है क्योंकि यह वास्तव में कोई असाइनमेंट नहीं है, लेकिन केवल age_= ( age_= द्वारा प्रदान) विधि है।