कोटलिन टर्नरी कंडिशनल ऑपरेटर


जवाबों:


616

कोटलिन में, ifकथन अभिव्यक्ति हैं। तो निम्नलिखित कोड समतुल्य है:

if (a) b else c

अभिव्यक्ति और कथन के बीच का अंतर यहाँ महत्वपूर्ण है। जावा / सी # / जावास्क्रिप्ट में, ifएक बयान बनाता है, जिसका अर्थ है कि यह एक मूल्य पर हल नहीं होता है। अधिक संक्षेप में, आप इसे किसी चर में निर्दिष्ट नहीं कर सकते।

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

यदि आप एक ऐसी भाषा से आ रहे हैं जहां ifएक कथन है, तो यह अप्राकृतिक लग सकता है लेकिन यह भावना जल्द ही कम होनी चाहिए।


57
इसके अतिरिक्त आप उपयोग कर सकते हैं when
बैशोर

5
बस जोड़ने के लिए, अगर यह एक बूलियन अभिव्यक्ति है, तो आप यहां तक ​​जा सकते हैंx = a==b
gnomeria

2
@MikeRylander मैंने यह स्पष्ट करने के लिए उत्तर बढ़ाया है। इस पर ध्यान दिलाने के लिए धन्यवाद।
ड्रू नोक

1
@ AdeelAnsari नहीं, यह ठीक नहीं है। यह बेकार है। इसकी तुलना कीजिए। b + if (a) c else dबनाम b + (c if (a) else d)बाद वाले को अतिरिक्त कोष्ठक की आवश्यकता होती है। क्योंकि cशर्त से संलग्न नहीं है और else
Naetmul

1
यहां इस विषय पर थोड़ी चर्चा की गई है। चर्चा करें ।kotlinlang.org
एफ। नॉर्बर्ट

70

आप अपनी खुद की निर्धारित कर सकते हैं Booleanविस्तार समारोह है कि रिटर्न nullजब Booleanहै falseएक संरचना त्रिगुट ऑपरेटर के समान प्रदान करने के लिए:

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

यह एक a ? b : cअभिव्यक्ति का अनुवाद इस तरह करेगा a then b ?: c:

println(condition then "yes" ?: "no")

अद्यतन: लेकिन कुछ और जावा-जैसे सशर्त स्विच करने के लिए आपको कुछ इस तरह की आवश्यकता होगी

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no") लंबोदर पर ध्यान दें। अपनी सामग्री गणना जब तक हम बनाने के लिए स्थगित कर दिया जाना चाहिए यकीन conditionहैtrue

यह एक अनाड़ी दिखता है, यही कारण है कि जावा टर्नरी ऑपरेटर को कोटलिन में पोर्ट करने के लिए उच्च मांग वाला अनुरोध मौजूद है


1
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
nullbyte

3
<T: किसी भी> का उपयोग करें, अन्यथा यह गलत तरीके से काम करेगा:true then { null } ?: "not-null"
यूजीन पेट्रेंको

BTW, ?:ऑपरेटर यहां है elvis-operator: kotlinlang.org/docs/reference/null-safety.html#elvis-operator
एरिक वांग

64

टी एल; डॉ

if (a) b else c

टर्नरी ऑपरेटर अभिव्यक्ति के बजाय आप क्या उपयोग कर सकते हैं a ? b : c


Kotlin में, कई नियंत्रण विवरण सहित if, whenया यहाँ तक कि tryके रूप में इस्तेमाल किया जा सकता भाव । इसका मतलब यह है कि उन लोगों के पास एक परिणाम हो सकता है जो एक चर को सौंपा जा सकता है, एक समारोह से वापस आ सकता है आदि।

सिंथेटिक रूप से, टर्नरी ऑपरेटर की कोई आवश्यकता नहीं है

कोटलिन के भावों के परिणामस्वरूप, भाषा को वास्तव में टर्नरी ऑपरेटर की आवश्यकता नहीं है

if (a) b else c

टर्नरी ऑपरेटर अभिव्यक्ति के बजाय आप क्या उपयोग कर सकते हैं a ? b : c

मुझे लगता है कि विचार यह है कि पूर्व अभिव्यक्ति अधिक पठनीय है क्योंकि हर कोई जानता है कि क्या ifelseकरता है, जबकि ? :यह स्पष्ट नहीं है कि आप पहले से ही वाक्य रचना से परिचित नहीं हैं।

फिर भी, मुझे यह स्वीकार करना होगा कि मैं अक्सर अधिक सुविधाजनक टर्नरी ऑपरेटर को याद करता हूं ।


अन्य विकल्प

कब

whenशर्तों की जाँच होने पर आप कोटलिन में उपयोग किए गए निर्माण भी देख सकते हैं। यह व्यक्त करने का एक तरीका भी है-यदि वैकल्पिक तरीके से कैस्केड किया जाए। निम्नलिखित ओटी उदाहरण के अनुरूप है।

when(a) {
    true -> b
    false -> c
}

एक्सटेंशन

अन्य उत्तर शो में कई अच्छे उदाहरणों ( कोटलिन टर्नेरी कंडिशनल ऑपरेटर ) के रूप में, एक्सटेंशन आपके उपयोग के मामले को सुलझाने में भी मदद कर सकते हैं।


36

अपने लिए मैं निम्नलिखित विस्तार कार्यों का उपयोग करता हूं:

fun T?.or<T>(default: T): T = if (this == null) default else this 
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this

यदि वस्तु ऑब्जेक्ट के बराबर है तो पहले वाला डिफ़ॉल्ट मान लौटा देगा। दूसरा एक ही मामले में लैम्ब्डा में प्रदान की गई अभिव्यक्ति का मूल्यांकन करेगा।

उपयोग:

1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }

व्यक्तिगत रूप से मेरे लिए कोड अधिक ifनिर्माण योग्य से अधिक पठनीय है


34
यह सवाल के लिए प्रासंगिक नहीं है, लेकिन उपयोग क्यों नहीं ?: , एल्विस ऑपरेटर ? पहले समारोह के साथ बदल दिया जाएगा e.getMessage() ?: "unknown"। दूसरे के रूप में व्यक्त किया जा सकता हैobj?.lastMessage?.timestamp ?: { Date() }()
हॉटकी

1
@hotkey इसके लिए कोई विशेष उद्देश्य नहीं है। मेरे दृष्टिकोण से यह श्रृंखला संचालन में अधिक सुसंगत और नेत्रहीन कम शोर दिखता है क्योंकि आपको कोष्ठक में निर्माण को लपेटना नहीं चाहिए
ruX

14
@ruX एल्विस ऑपरेटर विशेष रूप से इसके लिए है और आपका उपयोग असामान्य है।
जैसन मिनार्ड

6
जबकि?: ठीक है, चलो पर्ल के लिए सड़क से बहुत दूर नहीं जाना चाहिए।
रिचर्ड हेवन

29

जावा के टर्नरी ऑपरेटर के समकक्ष

a ? b : c

एक लाइन में एक सरल IF in Kotlin है

if(a) b else c

कोई टर्नरी ऑपरेटर नहीं है (स्थिति? फिर: और), क्योंकि साधारण अगर इस भूमिका में ठीक काम करता है।

https://kotlinlang.org/docs/reference/control-flow.html#if-expression


नल तुलना के लिए विशेष मामला

आप एल्विस ऑपरेटर का उपयोग कर सकते हैं

if ( a != null ) a else b
// equivalent to
a ?: b

28

नहीं है कोई त्रिगुट ऑपरेटर kotlin में, के रूप में if elseब्लॉक रिटर्न मूल्य

तो, आप कर सकते हैं: val max = if (a > b) a else b जावा के बजायmax = (a > b) ? b : c

हम whenनिर्माण का उपयोग भी कर सकते हैं , यह भी मूल्य लौटाता है:

val max = when(a > b) {
    true -> a
    false -> b
}

यहाँ कोटलिन प्रलेखन के लिए लिंक है: नियंत्रण प्रवाह: यदि, जब, के लिए, जबकि


27

कोटलिन में, ifएक अभिव्यक्ति है, अर्थात यह एक मूल्य देता है। इसलिए कोई टर्नरी ऑपरेटर नहीं है (condition ? then : else), क्योंकि साधारण अगर इस भूमिका में ठीक काम करता है। मैनुअल स्रोत यहाँ से

// Traditional usage 
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression 
val max = if (a > b) a else b

26

कुछ कोने के मामलों का अन्य उत्तरों में उल्लेख नहीं किया गया है।

Kotlin 1.1 में टेकआईएफ की उपस्थिति के बाद से टर्नरी ऑपरेटर a ? b : cको भी इस तरह व्यक्त किया जा सकता है:

b.takeIf { a } ?: c

यह उस स्थिति में भी छोटा हो जाता है जब c null:

b.takeIf { a }

यह भी ध्यान दें कि जावा दुनिया में विशिष्ट शून्य चेक value != null ? value : defaultValueसिर्फ वैचारिक कोटलिन में अनुवाद की तरह है value ?: defaultValue

इसी तरह a != null ? b : cका अनुवाद किया जा सकता है a?.let { b } ?: c


6
से b.takeIf { a } ?: cछोटा और अधिक पठनीय कैसे है if (a) b else c? टरनेरे ऑपरेटर निश्चित रूप से कोटलिन में चर नाम से एक लापता विशेषता है और स्थिति लंबी हो सकती है और आपको उस रेखा को विभाजित कर सकती है जो खराब है
जावेद सादिकज़ादे

1
यह भी ध्यान दिया जाना चाहिए कि takeIfहमेशा सही-मामले (यहां a) का मूल्यांकन करता है । न केवल यह कि व्यर्थ होने पर अभिव्यक्ति की गणना बेकार की aजा सकती है, लेकिन आप स्मार्ट कास्ट ला ला से लाभ नहीं उठा सकते हैं if (a is Int) { a + 3 }
TheOperator

@ TheOperator, गलत। { a }एक आलसी का मूल्यांकन किया हुआ लंबोदर है।
वडज़िम

1
मैंने इसे गलत लिखा, "हमेशा सच्चे-मामले (यहाँ b) का मूल्यांकन करना चाहिए "। लेकिन फिर भी { a }, जबकि आलसी, अभिव्यक्ति का परिणाम निर्धारित करने के लिए मूल्यांकन किया जाना चाहिए।
TheOperator

24

डॉक्स पर एक नज़र डालें :

कोटलिन में, यदि एक अभिव्यक्ति है, तो यह एक मान लौटाता है। इसलिए कोई टर्नरी ऑपरेटर नहीं है (स्थिति? फिर: और), क्योंकि साधारण अगर इस भूमिका में ठीक काम करता है।



12

TASK :

आइए निम्नलिखित उदाहरण पर विचार करें:

if (!answer.isSuccessful()) {
    result = "wrong"
} else {
    result = answer.body().string()
}
return result

हमें कोटलिन में निम्नलिखित समकक्ष की आवश्यकता है:

वापसी (उत्तर ।isSuccessful ()) ? "गलत" : उत्तर। कोई ()। स्ट्रिंग ()।


समाधान :

1. ए । आप if-expressionकोटलिन में उपयोग कर सकते हैं :

return if (!answer.isSuccessful()) "wrong" else answer.body().string()

1. बी । यह बहुत अच्छा हो सकता है यदि आप इसे फ्लिप करते हैं if-expression(चलो इसके बिना करते हैं not):

return if (answer.isSuccessful()) answer.body().string() else "wrong"

। कोटलिन का एल्विस ऑपरेटर ?:बेहतर काम कर सकता है:

return answer.body()?.string() ?: "wrong"

। या Extension functionसंबंधित Answerवर्ग के लिए उपयोग करें :

fun Answer.bodyOrNull(): Body? = if (isSuccessful()) body() else null

Extension functionआप का उपयोग करके एक कोड को कम कर सकते हैं धन्यवाद Elvis operator:

return answer.bodyOrNull()?.string() ?: "wrong"

। या बस whenऑपरेटर का उपयोग करें :

when (!answer.isSuccessful()) {
    parseInt(str) -> result = "wrong"
    else -> result = answer.body().string()
}

उम्मीद है की यह मदद करेगा।


11

जब सी-जैसी भाषाओं के स्विच ऑपरेटर की जगह लेता है। सबसे सरल रूप में यह ऐसा दिखता है

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

3
सच है, लेकिन आप जो उदाहरण दिखाते हैं वह whenएक कथन के रूप में है, न कि एक अभिव्यक्ति के रूप में। टर्नरी सशर्त अभिव्यक्तियों के साथ एक अधिक प्रासंगिक तुलना यह होगी कि प्रत्येक शाखा का एक मूल्य लौटाया जाए, जैसे कि संपूर्ण जब अभिव्यक्ति एक मूल्य का मूल्यांकन करती है (जैसा कि टर्नरी सशर्त के साथ होता है)।
ड्रू नॉक्स

9

कोटलिन में कोई टर्नरी ऑपरेटर नहीं है। यह पहली नज़र में समस्याग्रस्त लगता है। लेकिन लगता है कि हम इसे इनलाइन के साथ कर सकते हैं यदि कोई और बयान है क्योंकि यह यहां अभिव्यक्ति है। बस हमें करना है -

var number = if(n>0) "Positive" else "Negetive"

यहां हम और भी हो सकते हैं अगर हमें जितनी जरूरत हो उतने ब्लॉक करें। पसंद-

var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"

तो यह रेखा टर्नरी ऑपरेटर की तुलना में इतनी सरल और बहुत पठनीय है। जब हम जावा में एक से अधिक टर्नरी ऑपरेटर का उपयोग करते हैं तो यह भयानक लगता है। लेकिन यहां हमारे पास एक स्पष्ट वाक्यविन्यास है। यहां तक ​​कि हम इसे कई लाइन में भी लिख सकते हैं।


9

आप var a= if (a) b else cटर्नरी ऑपरेटर के स्थान पर उपयोग कर सकते हैं ।

कोटलिन की एक और अच्छी अवधारणा एल्विस ऑपरेटर है। आपको हर बार नल की जांच करने की आवश्यकता नहीं है।

val l = b?.length ?: -1

यदि b null नहीं है तो यह लंबाई वापस आ जाएगी अन्यथा यह राइट साइड स्टेटमेंट निष्पादित करता है।


7

आकर्षित नोक के रूप में, अगर अभिव्यक्ति के रूप में कोटलिन का उपयोग किया जाता है, तो टर्नरी कंडिशनल ऑपरेटर अब जरूरी नहीं है,

लेकिन एक्सटेंशन फ़ंक्शन और इन्फिक्स ओवरलोडिंग के साथ, आप इसे स्वयं लागू कर सकते हैं, यहां एक उदाहरण है

infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value)

class TernaryExpression<out T>(val flag: Boolean, val truly: T?) {
    infix fun <T> or(falsy: T?) = if (flag) truly else falsy
}

तो इसे इस तरह का उपयोग करें

val grade = 90
val clazz = (grade > 80) then "A" or "B"

शायद निकालें <टी> बेहतर ix इन्फिक्स मज़ा या (झूठा: टी?) = अगर (झंडा) सही मायने में मिथ्या है
एकल

1
लेकिन जोड़ <टी> यह काम कर सकते हैं: (ग्रेड> 80) तो शून्य या "बी"
एकल

यह वास्तव में अच्छा है, मैं इसका उपयोग करने जा रहा हूं: पी लेकिन ध्यान दें कि जब तक मैं गलत नहीं हूं, तब तक यह हर बार कॉल किए जाने वाले ऑब्जेक्ट आवंटन का कारण होगा। एक बड़ी बात नहीं है, लेकिन यह जानने के लायक है कि यह शून्य लागत का अमूर्त नहीं है।
एडम

6

एक और दिलचस्प दृष्टिकोण का उपयोग करना होगा when:

when(a) {
  true -> b
  false -> b
}

कुछ अधिक जटिल परिदृश्यों में काफी उपयोगी हो सकता है। और ईमानदारी से, यह मेरे लिए अधिक पठनीय हैif ... else ...


6

आप इसे कोटलिन में कई तरह से कर सकते हैं

  1. अगर का उपयोग कर

    if(a) b else c
  2. का उपयोग करते समय

    when (a) { 
        true -> print("value b") 
        false -> print("value c") 
        else -> {  
            print("default return in any other case") 
        } 
    }
  3. अशक्त सुरक्षा

    val a = b ?: c

5

कोटलिन में कोई टर्नरी ऑपरेशन नहीं है, लेकिन इसके आसपास काम करने के कुछ मजेदार तरीके हैं। जैसा कि अन्य ने बताया है, कोटलिन में एक सीधा अनुवाद इस तरह दिखेगा:

val x = if (condition) result1 else result2

लेकिन, व्यक्तिगत रूप से, मुझे लगता है कि थोड़ा अव्यवस्थित और पढ़ने में कठिन हो सकता है। पुस्तकालय में निर्मित कुछ अन्य विकल्प हैं। आप एक सहायक ऑपरेटर के साथ takeIf {} का उपयोग कर सकते हैं:

val x = result1.takeIf { condition } ?: result2

वहाँ क्या हो रहा है कि takeIf {} कमांड या तो आपका result1 या null देता है, और एल्विस ऑपरेटर null विकल्प को संभालता है। उदाहरण के लिए, कुछ अतिरिक्त विकल्प हैं, {{}

val x = result1.takeUnless { condition } ?: result2

भाषा स्पष्ट है, आप जानते हैं कि यह क्या कर रहा है।

यदि यह आमतौर पर इस्तेमाल की जाने वाली स्थिति है, तो आप कुछ मजेदार भी कर सकते हैं जैसे इनलाइन एक्सटेंशन विधि का उपयोग करें। चलो मान लेते हैं कि हम एक इंट के रूप में एक गेम स्कोर को ट्रैक करना चाहते हैं, उदाहरण के लिए, और हम हमेशा 0 वापस करना चाहते हैं यदि किसी दिए गए शर्त को पूरा नहीं किया जाता है:

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

ठीक है, यह बदसूरत लगता है। लेकिन विचार करें कि जब इसका उपयोग किया जाता है तो यह कैसा दिखता है:

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

जैसा कि आप देख सकते हैं, कोटलिन आपके कोड को व्यक्त करने के तरीके का चयन करने में बहुत अधिक लचीलापन प्रदान करता है। मेरे उदाहरणों के अनगिनत रूप हैं और संभवत: ऐसे तरीके जो मैंने अभी तक खोजे नहीं हैं। आशा है कि ये आपकी मदद करेगा!


takeIfवास्तव में मेरा पसंदीदा विकल्प है, बहुत सुंदर।
जेवियर मेंडोंका

4

याद रखें कि टर्नरी ऑपरेटर और एल्विस ऑपरेटर कई लोकप्रिय भाषाओं के विपरीत कोटलिन में अलग-अलग अर्थ रखते हैं। करना expression? value1: value2आपको किसी अन्य भाषा के विपरीत, कोटलिन कंपाइलर द्वारा बुरे शब्द देगा, क्योंकि कोटलिन में कोई टर्नरी ऑपरेटर नहीं है जैसा कि आधिकारिक डॉक्स में उल्लेख किया गया है । कारण यह है कि यदि, कब और कब-कब-कब बयान स्वयं मान लौटाते हैं।

तो, करने expression? value1: value2से प्रतिस्थापित किया जा सकता है

वैल अधिकतम = यदि (a> b) प्रिंट ("एक चुनें") और प्रिंट ("बी चुनें")

एल्विस ऑपरेटर कि Kotlin है, केवल नल चर पूर्व के मामले में काम करता है .:

मैं कुछ ऐसा करते हैं value3 = value1 ?: value2तो अगर मान 1 है अशक्त तो मान 2 लौटा दिया जाएगा अन्यथा मान 1 लौटा दिया जाएगा।

इन उत्तरों से अधिक स्पष्ट समझ हासिल की जा सकती है


3

आप इसके लिए ifकोटलिन में अभिव्यक्ति का उपयोग कर सकते हैं । कोटलिन ifमें एक परिणाम मूल्य के साथ एक अभिव्यक्ति है। तो कोटलिन में हम लिख सकते हैं

fun max(a: Int, b: Int) = if (a > b) a else b

और जावा में हम समान लेकिन बड़े कोड के साथ प्राप्त कर सकते हैं

int max(int a, int b) {
return a > b ? a : b
}

2

यदि आप मानक संकेतन का उपयोग नहीं करते हैं तो आप infix का उपयोग करके इसे बना / अनुकरण भी कर सकते हैं कुछ इस तरह से :

अपना लक्ष्य रखने के लिए एक क्लास बनाएं और परिणाम:

data class Ternary<T>(val target: T, val result: Boolean)

एक ternary ऑपरेशन अनुकरण करने के लिए कुछ infix फ़ंक्शन बनाएं

infix fun <T> Boolean.then(target: T): Ternary<T> {
    return Ternary(target, this)
}

infix fun <T> Ternary<T>.or(target: T): T {
    return if (this.result) this.target else target
}

तब आप इसे इस तरह उपयोग कर पाएंगे:

val collection: List<Int> = mutableListOf(1, 2, 3, 4)

var exampleOne = collection.isEmpty() then "yes" or "no"
var exampleTwo = (collection.isNotEmpty() && collection.contains(2)) then "yes" or "no"
var exampleThree = collection.contains(1) then "yes" or "no"

एक वास्तविक टर्नरी ऑपरेटर के समतुल्य होने के लिए, टारगेट वैल्यू भी लैंबडा सप्लाई कर सकती है
पुराने जमाने का आदमी

1

उपयोग करने के लिए एक और छोटा तरीका

val value : String = "Kotlin"

value ?: ""

यहाँ कोटलिन स्वयं शून्य मान की जाँच करता है और यदि यह अशक्त है तो यह रिक्त स्ट्रिंग मान से गुजरता है।


1

कोई इस तरह का उपयोग क्यों करेगा:

when(a) {
  true -> b
  false -> b
}

जब आप वास्तव में ऐसा कुछ उपयोग कर सकते हैं ( aइस मामले में बूलियन है):

when {
  a -> b
  else -> b
}

1
क्योंकि पहले वाला शब्द स्पष्ट रूप से स्पष्ट और आसानी से समझ में आने वाले किसी अन्य व्यक्ति के लिए है, भले ही वे परिचित डब्ल्यू / कोटलिन न हों, जबकि दूसरा वह नहीं है।
mc01

1
ठीक है, आपको वह बात मिल गई है, हालाँकि मैं यह नहीं समझ पा रहा हूँ कि कोटलिन डेवलपर्स ने त्रिगुट अभिव्यक्ति का परिचय क्यों नहीं दिया
ZZ 5

मुझे लगता है कि ? and :एक प्रकार की जांच के बजाय अशक्त / प्रकार की घोषणा के साथ विरोधाभास है। इसके अलावा मुझे कोई कारण नहीं दिखता। मुझे लगता है कि किसी ने निश्चित रूप से कुछ विचार रखा होगा, अगर इनलाइन है तो-और शर्त की जांच करें। आइए इंतजार करें और भविष्य के संस्करणों में देखें।
b44r4th

1

आवेदन के साथ काम करते समय (), टर्नरी ऑपरेशन से निपटने के दौरान बहुत आसान लगता है, क्योंकि यह अधिक सुरुचिपूर्ण है और आपको कमरा देता है

val columns: List<String> = ...
val band = Band().apply {
    name = columns[0]
    album = columns[1]
    year = columns[2].takeIf { it.isNotEmpty() }?.let { it.toInt() } ?: 0
}

0

निम्नलिखित कार्यों के साथ मैं कई सामान्य उपयोग के मामलों को कवर कर सकता हूं, ठीक उसी तरह जैसे कि पायथन में किया जा सकता है:

class TestKotlinTernaryConditionalOperator {

    @Test
    fun testAndOrInfixFunctions() {
        Assertions.assertThat(true and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(false and "yes" or "no").isEqualTo("no")

        Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat("" and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(0 and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes")
        @Suppress("CAST_NEVER_SUCCEEDS")
        Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no")
    }
}

infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null
infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null
infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null
infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null
infix fun <E> E?.or(other: E?): E? = this ?: other

0

कोटलिन में कोई टर्नरी ऑपरेटर नहीं है, सबसे बंद दो मामलों के नीचे हैं,

  • अगर अभिव्यक्ति कथन के रूप में

val a = true if(a) print("A is true") else print("A is false")

  • एल्विस ऑपरेटर

यदि बाईं ओर अभिव्यक्ति ?: शून्य नहीं है, तो एल्विस ऑपरेटर इसे वापस कर देता है, अन्यथा यह अभिव्यक्ति को दाईं ओर लौटाता है। ध्यान दें कि दाएं-हाथ की अभिव्यक्ति का मूल्यांकन केवल तभी किया जाता है जब बाएं हाथ की ओर अशक्त हो।

 val name = node.getName() ?: throw IllegalArgumentException("name expected")

संदर्भ डॉक्स


0

उदाहरण: var energy: Int = data? .get (स्थिति) ?. energy? .toInt ()?: 0

यदि आप उपयोग कर रहे हैं तो कोटलिन में ?: यह ऐसे काम करेगा जैसे यदि स्टेटमेंट शून्य हो जाएगा ?: 0 इसमें 0 लगेगा या जो भी आपने इस पक्ष को लिखा है।


-1

कोटलिन में आप इस तरह के टर्नरी ऑपरेशन का उपयोग कर सकते हैं: val x = if(a) "add b" else "add c"


1
इस सवाल का जवाब पहले से ही पर्याप्त है, और हाल ही में अपडेट नहीं किया गया है। अब एक और उत्तर पोस्ट करने की आवश्यकता नहीं है जो पहले वाले से अलग नहीं है।
हेडक्राकर

-2

अन्य विचारों के कुछ शोध के बाद, मैंने निम्नलिखित टर्नरी ऑपरेटर को प्राप्त किया है:

infix fun <T : Any> Boolean.yes(trueValue: T): T? = if (this) trueValue else null
infix fun <T : Any> T?.no(falseValue: T): T = this ?: falseValue

उदाहरण ( यहां भागो ):

fun main() {
    run {
        val cond = true
        val result = cond yes "True!" no "False!"
        println("ternary test($cond): $result")
    }
    run {
        val cond = false
        val result = cond yes "True!" no "False!"
        println("ternary test($cond): $result")
    }
}

यह संस्करण धाराप्रवाह है और अशक्त सहवर्ती ऑपरेटर के साथ संघर्ष नहीं करता है।


यह उसी तरह का है जैसा कि शैतान का जवाब है, जहां इसका नाम thenइसके बजाय रखा गया है yes
Ry-

@ हाँ, और मुझे यकीन नहीं है कि अगर वे एक ही व्यक्ति हैं, लेकिन वैकल्पिक तरीकों के साथ infix विधियों का उपयोग करने का विचार कोटलिन फोरम से आता है। मैंने जो नहीं देखा है, वह 'नहीं' पद्धति है, जिसके साथ मैं आया था क्योंकि मुझे अशक्त सहकर्मी ऑपरेटर को भ्रमित करने के इनलाइन उपयोग का पता चलता है क्योंकि प्रश्न चिह्न की स्थिति के बजाय 'तत्कालीन मूल्य' के बाद है क्योंकि यह अधिकांश भाषाओं में है।
ब्रायन डब्ल्यू। वैगनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.