मैंने एक्सटेंशन गुण बनाए हैं और मुझे यह समस्या हो रही है

fun main(args: Array<String>) {
    println(Animal("Mia",1,1.0))
}

class Animal(var name : String, var age : Int, var weight : Double)

var Animal.getXXX : String   // compiler : Property must be initialized
get() = "$name, $age, $weight"

val Animal.getXXX : String   // the compiler is running properly
get() = "$name, $age, $weight"

उपरोक्त कोड में। मुझे var के बजाय val का उपयोग क्यों करना चाहिए?

0
Ilham Bagus Bahrudin 27 अक्टूबर 2020, 14:49

3 जवाब

सबसे बढ़िया उत्तर

त्रुटि संदेश शायद थोड़ा भ्रमित करने वाला है। var का उपयोग करने वाले एक्सटेंशन फ़ील्ड के लिए उनसे गेट्टर और सेटर दोनों होने की उम्मीद की जाती है। val का उपयोग करने वाले फ़ील्ड में केवल एक गेट्टर होना चाहिए (और एक सेटर नहीं हो सकता)। निम्नलिखित कोड काम करता है:

var Animal.getFoo : String
get() = "$name, $age, $weight"
set(value) { /* do something */ }
2
Aplet123 27 अक्टूबर 2020, 14:55

Var परिवर्तनशील है और हम इसके मान को पुन: असाइन या बदल सकते हैं। लेकिन हम वैल वैल्यू नहीं बदल सकते।

0
Umair Naseem 27 अक्टूबर 2020, 15:22

विस्तार गुणों में var और val के बीच का अंतर यह है कि विस्तार गुण लिखते समय यदि आप val का उपयोग करते हैं तो आप केवल get का उपयोग कर सकते हैं क्योंकि आप इसके लिए मान निर्धारित नहीं कर सकते क्योंकि यह अपरिवर्तनीय स्थिर चर है आप वैल एक्सटेंशन प्रॉपर्टी में सेट () का उपयोग नहीं कर सकते हैं

उदाहरण के लिए

val String.extensionProperty
    get() = "Value"

और अगर आप var के साथ एक एक्सटेंशन प्रॉपर्टी बनाना चाहते हैं, जिसे आप म्यूटेबल बनाना चाहते हैं, तो आप इसमें वैल्यू भी सेट कर सकते हैं और वेरिएबल को अपडेट करते समय कोई अन्य क्रिया कर सकते हैं।

उदाहरण के लिए

var String.extensionProperty
    get() = "Value"
    set(value) {
        println("variable has been updated with this data $value")
    }
0
Arbaz Pirwani 27 अक्टूबर 2020, 15:29