Ne yapar?: Kotlin'de yapmak? (Elvis Operatörü)


Yanıtlar:


115

TL; DR: Ortaya çıkan nesne referansı [birinci işlenen] değilse null, döndürülür. Aksi takdirde ikinci işlenenin değeri (olabilir null) döndürülür


Elvis operatör birçok programlama dilleri, örneğin KOTLIN aynı zamanda Groovy veya C # parçasıdır. Wikipedia tanımını oldukça doğru buluyorum :

Bazı bilgisayar programlama dillerinde, Elvis operatörü ?: , bu işlenen ise ilk işlenenini döndüren ve aksi takdirde ikinci işlenenini değerlendirip döndüren bir ikili operatördürtrue . Bu ise üçlü koşullu operatörün varyantı , ? :bu diller (ve diğerleri) 'de bulunan Elvis operatörü ihmal ikinci işlenen ile üçlü operatör .

Aşağıdakiler özellikle Kotlin için geçerlidir:

Bazı bilgisayar programlama dilleri bu operatör için farklı anlamlara sahiptir. İlk işlenenin bir mantıksal değerle sonuçlanması yerine, bir nesne başvurusu ile sonuçlanması gerekir . Ortaya çıkan nesne başvurusu değilse null, döndürülür. Aksi takdirde ikinci işlenenin değeri (olabilir null) döndürülür.

Bir örnek:

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

3
Bu gerçekten havalı. elvis operatorBaşka bir şeye daha da indirgenebileceğini hiç düşünmemiştim . Güzel! Ve güzel açıklama, teşekkür ederim!
sud007

88

Elvis Operatör Bir kolon ile bir soru işareti ile temsil edilir: ?:ve bu sözdizimi ile kullanılabilir:

first operand ?: second operand

Consise kodu yazmanıza olanak tanır ve şu şekilde çalışır:

Eğer first operand boş değil , o zaman iade edilecektir. O takdirde null , daha sonra second operandiade edilecektir. Bu, sağlanan değer null ise null yapılamayan bir değer sağlayacağınız için bir ifadenin boş değer döndürmeyeceğini garanti etmek için kullanılabilir.


Örneğin (Kotlin'de):

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"
}

Bu durumda, hesaplanan değeri getPotentialNullboş değilse, döndürülür retrieveString; Boş ise, "Secondary Not-Null String"bunun yerine ikinci ifade döndürülür.

Ayrıca sağ taraftaki ifade değerlendirilir unutmayın sadece sol taraftaki ise boş .

Kotlin'de, bir ifade gibi herhangi second operandbir throw Exceptionifadeyi kullanabilirsiniz.

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

Elvis Operator adı, ünlü Amerikalı şarkıcı Elvis Presley'den geliyor . Saç modeli soru işaretine benziyor

Elvis QuestionMark

Kaynak: Wojda, I. Moskala, M. Kotlin ile Android Geliştirme. 2017. Packt Yayıncılık


84
Artı 1 Mr Presley açıklanması amacıyla
s1m0nw1

7
? :) (Elvis gülümserken görün)
LeoColman

1
Bir süre sonra neden Elvis Operatörü dendiğini anlayamıyorum. Resminiz bana neden Elvis Operatörü denildiğini anlamamı sağladı. :)
Yohanes AI

Elvis hakkındaki hikaye gerçekten doğru mu? haha
Hillcow

@Kerooker Gülümsemiyor mu?: | daha iyi IMO olacak.
ahmed galal

38

Buna Elvis operatörü denir ve öyle ... Sorunuzda tam olarak anlattığınız gibi. Sol tarafı bir nulldeğer ise, bunun yerine sağ tarafı bir geri dönüş olarak döndürür. Aksi takdirde sadece sol taraftaki değeri döndürür.

a ?: bsadece kısaltmasıdır if (a != null) a else b.

Türlerle ilgili birkaç örnek daha:

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
Java'dan

9

Tanıma bir göz atalım :

Boş değer atanabilir bir referansımız olduğunda, "r boş değilse, kullanın, aksi takdirde boş olmayan bir x değeri kullanın" diyebiliriz:

?:(Elvis) operatörü ayrıntı önler ve gerçekten özlü kodunuzu yapar.

Örneğin, birçok koleksiyon uzantısı işlevi nullyedek olarak geri döner .

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

?:size, birden çok geri dönüş katmanınız olsa bile, yedek durumu büyük ölçüde ele almanın bir yolunu sunar. Öyleyse, burada olduğu gibi, çarpma Elvis operatörlerini zincirleyebilirsiniz:

val l = listOf(1, 2, 3)

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

Eğer aynı şeyi if else ile ifade ederseniz, okunması daha zor olan çok daha fazla kod olurdu.


3

Basitçe şunu söyleyebiliriz, iki elin var. Bilmek istiyorsun, sol elin şu anda çalışıyor mu? Sol el çalışmıyorsa, return emptyyoksabusy

Java örneği:

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

Kotlin için örnek:

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

Bu cevabı seviyorum. Anlamak için çok fazla temiz.
Gk Mohammad Emon

2

Temel olarak, Elvis'in sol tarafı herhangi bir nedenle boş döndürürse, bunun yerine sağ tarafı döndürür.

yani

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

Bu nedenle, sayı boş DEĞİL ise, sayıyı basar , aksi takdirde "Sayı boştur" yazar.


1

Kotlin'deki elvis operatörü, boş güvenlik için kullanılır.

x = a ?: b

Yukarıdaki kodda, xdeğerini atanacaktır abir değilse nullve beğer aolduğunu null.

Elvis operatörünü kullanmadan eşdeğer kotlin kodu aşağıdadır:

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

1

Biraz ek olsa da bu

X = A ?: B

XHala olacak nullhem eğer Ave Bdeğerlendirmeknull

Bu nedenle, Xher zaman olmak istiyorsanız , her zaman a veya bunun bir işlev veya ifade olup olmadığını değerlendirdiğinden non-nullemin olun .Bnon-nullBnon-null

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.