क्या करता है?: कोटलिन में करते हैं? (एल्विस ऑपरेटर)


98

मैं यह पता नहीं लगा सकता कि ?:इस मामले में उदाहरण के लिए क्या करता है

val list = mutableList ?: mutableListOf() 

और इसे क्यों संशोधित किया जा सकता है

val list = if (mutableList != null) mutableList else mutableListOf()

5
यदि यह शून्य नहीं है, तो बाईं ओर लौटें, अन्यथा दाईं ओर लौटें। पहली अभिव्यक्ति दूसरी अभिव्यक्ति के लिए संक्षिप्त संकेतन है। kotlinlang.org/docs/reference/null-safety.html#elvis-operator
युजेन पिंचेक

जवाबों:


115

TL; DR: यदि परिणामी वस्तु संदर्भ [पहला ऑपरेंड] नहीं है null, तो इसे लौटा दिया जाता है। अन्यथा दूसरे ऑपरेंड (जो हो सकता है null) का मान लौटाया जाता है


एल्विस ऑपरेटर कई प्रोग्रामिंग भाषाओं, जैसे Kotlin लेकिन यह भी ग्रूवी या सी # का हिस्सा है। मुझे विकिपीडिया की परिभाषा बहुत सटीक लगती है:

कुछ कंप्यूटर प्रोग्रामिंग भाषाओं में, एल्विस ऑपरेटर ?: एक द्विआधारी ऑपरेटर है जो अपना पहला ऑपरेंड लौटाता है यदि वह ऑपरेंड है true, और अन्यथा उसका दूसरा ऑपरेंड का मूल्यांकन और रिटर्न करता है। यह एक है त्रिगुट सशर्त ऑपरेटर के संस्करण , ? :, उन भाषाओं (और कई अन्य) में पाया: एल्विस ऑपरेटर है अपनी दूसरी छोड़े गए संकार्य के साथ त्रिगुट ऑपरेटर

कोटलिन के लिए निम्नलिखित विशेष रूप से सच है:

कुछ कंप्यूटर प्रोग्रामिंग भाषाओं में इस ऑपरेटर के लिए अलग शब्दार्थ हैं। बूलियन में परिणाम होने वाले पहले ऑपरेंड के बजाय, इसका परिणाम ऑब्जेक्ट संदर्भ में होना चाहिए । यदि परिणामी वस्तु संदर्भ नहीं है null, तो इसे लौटा दिया जाता है। अन्यथा दूसरे ऑपरेंड (जो हो सकता है null) का मान लौटाया जाता है।

एक उदाहरण:

x ?: y // yields `x` if `x` is not null, `y` otherwise.

3
यह वास्ताव में अच्छा है। मैंने कभी नहीं सोचा था कि elvis operatorइसे कुछ और घटाया जा सकता है। अच्छा! और अच्छी व्याख्या, धन्यवाद!
सूद 7

88

एल्विस ऑपरेटर उसके बाद एक कॉलन एक प्रश्न चिह्न का प्रतिनिधित्व करती है: ?:और यह इस वाक्य रचना के साथ प्रयोग किया जा सकता है:

first operand ?: second operand

यह आपको एक कॉन्सस कोड लिखने में सक्षम बनाता है, और इस तरह काम करता है:

यदि first operand अशक्त नहीं है , तो उसे वापस कर दिया जाएगा। यदि यह अशक्त है , तो second operandवसीयत वापस कर दी जाएगी। इसका उपयोग यह गारंटी देने के लिए किया जा सकता है कि कोई अभिव्यक्ति शून्य मान नहीं लौटाएगी, क्योंकि यदि आप प्रदान किया गया मान अशक्त है तो आप एक अशक्त मान प्रदान करेंगे।


उदाहरण के लिए (कोटलिन में):

fun retrieveString(): String {    //Notice that this type isn't nullable
    val nullableVariable: String? = getPotentialNull() //This variable may be null
    
    return nullableVariable ?: "Secondary Not-Null String"
}

इस मामले में, यदि गणना की गई मान getPotentialNullशून्य नहीं है, तो इसे वापस कर दिया जाएगा retrieveString; यदि यह अशक्त है, तो "Secondary Not-Null String"इसके बजाय दूसरी अभिव्यक्ति लौटा दी जाएगी।

यह भी ध्यान दें कि दाएं हाथ की अभिव्यक्ति का मूल्यांकन केवल तभी किया जाता है जब बाएं हाथ की ओर अशक्त हो

कोटलिन में, आप किसी भी अभिव्यक्ति का उपयोग कर सकते हैं second operand, जैसे कि एक throw Exceptionअभिव्यक्ति

return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")

एल्विस ऑपरेटर का नाम प्रसिद्ध अमेरिकी गायक एल्विस प्रेस्ले से आता है । उनका हेयर स्टाइल एक प्रश्न चिह्न जैसा दिखता है

एल्विस प्रश्नमर्क

स्रोत: वोज्डा, आई। मोस्कला, एम। एंड्रॉइड डेवलपमेंट विद कोटलिन। 2017. पैकट प्रकाशन


84
श्री प्रेस्ली को चित्रण के लिए 1 प्लस
s1m0nw1

7
; :) (इसे एल्विस मुस्कुराते हुए देखें)
लियोकोलमैन

1
थोड़ी देर के बाद, मैं समझ नहीं पा रहा हूँ कि इसके एल्विस ऑपरेटर को क्यों कहा जाता है। आपके दृष्टांत से मुझे पता चला कि इसके एल्विस ऑपरेटर को क्यों कहा जाता है। :)
योहन एआई

क्या एल्विस के बारे में कहानी वास्तव में सच है? haha
हिल्सकॉन

@Kerooker वह मुस्कुरा नहीं रहा है ;: | बेहतर होगा IMO।
अहमल

38

इसे एल्विस ऑपरेटर कहा जाता है और यह करता है ... वास्तव में आपने अपने प्रश्न में क्या वर्णित किया है। यदि इसका बायाँ हाथ पक्ष एक nullमान है, तो यह एक खामी के रूप में, इसके बजाय दाईं ओर रिटर्न देता है। अन्यथा यह केवल बाएं हाथ की तरफ मूल्य लौटाता है।

a ?: bके लिए बस आशुलिपि है if (a != null) a else b

प्रकारों के साथ कुछ और उदाहरण:

val x: String? = "foo"
val y: String = x ?: "bar"      // "foo", because x was non-null    

val a: String? = null
val b: String = a ?: "bar"      // "bar", because a was null

10
यदि आप जावा से आते हैं, तो यह अधिक शॉर्टहैंड है:a != null ? a : b
crgarridos

9

चलो रक्षा पर एक नज़र डालते हैं :

जब हमारे पास एक अशक्त संदर्भ आर होता है, तो हम कह सकते हैं "यदि r शून्य नहीं है, तो इसका उपयोग करें, अन्यथा कुछ गैर-शून्य मान x का उपयोग करें":

?:(एल्विस) ऑपरेटर शब्दाडंबर से बचा जाता है और वास्तव में संक्षिप्त अपने कोड बनाता है।

उदाहरण के लिए, बहुत सारे संग्रह विस्तार फ़ंक्शन nullफ़ॉलबैक के रूप में लौटते हैं ।

listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")

?:यदि आप फॉलबैक की कई परतें हैं, तो भी आपको फॉलबैक मामले को संभालने का एक तरीका प्रदान करता है। यदि ऐसा है, तो आप बस एल्विस ऑपरेटरों की श्रृंखला को यहाँ की तरह बढ़ा सकते हैं:

val l = listOf(1, 2, 3)

val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")

यदि आप उसी के साथ व्यक्त करते हैं, तो यह एक बहुत अधिक कोड होगा जो पढ़ना मुश्किल है।


3

बस हम कह सकते हैं कि, आपके दो हाथ हैं। आप जानना चाहते हैं, क्या अभी आपका बायां हाथ काम कर रहा है? अगर बायां हाथ काम नहीं कर रहा है, return emptyतोbusy

जावा के लिए उदाहरण:

private int a;
if(a != null){
    println("a is not null, Value is: "+a)
}
else{
    println("a is null")
}

कोटलिन के लिए उदाहरण:

val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"

इस उत्तर को प्यार करो। समझने के लिए बहुत साफ है।
जीके मोहम्मद एमोन

2

मूल रूप से, यदि एल्विस के बाईं ओर किसी कारण से अशक्त हो जाता है, तो इसके बजाय दाईं ओर लौटता है।

अर्थात

val number: Int? = null
println(number ?: "Number is null")

इसलिए, यदि संख्या शून्य नहीं है , तो यह संख्या को प्रिंट करेगा , अन्यथा "संख्या शून्य है"।


1

कोटलिन में एल्विस ऑपरेटर का उपयोग शून्य सुरक्षा के लिए किया जाता है।

x = a ?: b

उपरोक्त कोड में, यदि नहीं है और यदि है x, का मान असाइन किया जाएगा ।anullbanull

एल्विस ऑपरेटर का उपयोग किए बिना समकक्ष कोटलिन कोड नीचे है:

x = if(a == null) b else a

1

थोड़ा जोड़ हालांकि यह है

X = A ?: B

Xअभी भी होगा nullअगर दोनों Aऔर Bमूल्यांकन करने के लिएnull

इसलिए, यदि आप Xहमेशा बने रहना चाहते हैं non-null, तो सुनिश्चित करें Bकि हमेशा एक ऐसा है non-nullया जो Bहमेशा मूल्यांकन करता है कि non-nullक्या यह एक फ़ंक्शन या अभिव्यक्ति है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.