2017-12-24 169 views
6

Kotlin'de, yalnızca başka bir değişken boş değilse (aksi halde op yok) bir ödev yapmak istiyorum. İki özlü yollar geliyor:Sadece sağ taraf null değilse, atamanın daha iyi bir yolu?

fun main(args: Array<String>) { 
    var x: Int? = null 
    var n = 0 

    // ... do something ... 

    x?.let { n = it } // method 1 
    n = x ?: n   // method 2 
} 

Ancak, bunlar yeterli özlü hissetmiyorum, ben onları yapmak zorunda frekans verilen. İlk yöntem aşırı bir şekilde görünüyor. İkinci yöntem, ?:'dan sonra bir ifadeyi gerektirdiğinde nagging yapmaktadır.

n =? x gibi daha iyi bir yol olması gerektiğinden şüpheleniyorum? Veya n = x?? Var mı?

+8

'fi x operasyonlarında yılında özel simüle' deneyin. – yole

cevap

0

aşağıdaki vardır:

val x: Int? = null 
val n: Int = x ?: return 

Bu n atanamayan bile, mükemmel iyi derler. 'Atama' sonrası n numaralı çağrılara bile izin verilir, ör. println(n), çünkü derleyici yalnızca n'un Int olduğunu biliyor ve sorun değil. Ancak, atamayı izleyen herhangi bir satır hiçbir zaman çağrılmayacaktır, çünkü biz return kapsamdan. İstediğinize bağlı olarak, bu bir op değil. Devam edemiyoruz çünkü n atanamadı, bu yüzden geri dönün.

Başka bir seçenek NullPointerException, x == null atıyorsa başka bir yere taşınması gereken val n: Int = x!!. Bu uygulamayı önermiyorum, çünkü Kotlin nullability işlemek için daha temiz yöntemler sunuyor.

+0

Gerçek kullanım durumum şudur: Java kütüphanesinin üstüne bir sarıcı işlevi (Kotlin'de) yazıyorum. Bir parametre boş değilse, değeri alttaki nesnedeki ilgili alana atanır. Boşsa, hiçbir şey yapılmaz ve alan varsayılan değerle bırakılır. Ayarlamak için birden fazla alan var, bu yüzden ortada dönmek bir seçenek değil. Yine de soruşturma ve öneri için teşekkürler. –

+1

Öyleyse, sanırım orijinal yöntem 2 en iyisi: açık, kısa, basit ve ne istediğinizi başardı. – Erik

1

KOTLIN içinde bu işlemi gerçekleştirmek için hiçbir özel sözdizimi yoktur infix için

// define this 
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this 

/////////////////////////////////////////////////////////// 
// Demo using 

// Now, Kotlin infix-style 
fooA assignFromNotNull fooB 
barA assignFromNotNull barB 
bazA assignFromNotNull bazB 

// Old code, Java if-style 
if (fooB != null) { 
    fooA = fooB; 
} 
if (barB != null) { 
    barA = barB; 
} 
if (bazB != null) { 
    bazA = bazB 
} 
+0

Infix işlev tanımlaması ile yapmaya çalıştığınız şeyi anlıyorum. Peki bu 3 satır Kotlin kodu nedir? Belli ki Kotlin'in meta verileri hakkında yeterince bilgim yok. –

+0

Demo kodu projemden kopyalandı. Cevabını temizlemek için temizleyeceğim. – Raymond