Kotlin

2017-07-28 28 views
19

'daki Takas İşlevleri, How to write a basic swap function in Java numaralı belgede anlatılan java yönteminden başka, kotlin'de genel takas işlevi yazmanın daha iyi bir yolu var.Kotlin

Genel takas işlevini daha özlü ve sezgisel hale getirebilen herhangi bir kotlin dili özelliği var mı?

cevap

17

Kotlin'de hiç bir takas işlevine gerek yoktur. Örneğin, mevcut also işlevini kullanabilirsiniz:

var a = 1 
var b = 2 

a = b.also { b = a } 

println(a) // print 2 
println(b) // print 1 
+9

. Yine de okuduğun zaman mantıklı geliyor! – Michael

+0

Kotlin’de yeniyim. Birisi burada neler olduğunu açıklayabilir mi lütfen? "Ayrıca" nedir, sonra blok nedir? – Jabba

+0

@Jabba, aşağıdaki linkleri bilmeniz gerektiğini anlamanız için yerleşik bir dahili hat uzantısı işlevidir: [extension function] (https://kotlinlang.org/docs/reference/extensions.html), [inline function] (https://kotlinlang.org/docs/reference/inline-functions.html) –

3

Düzenleme: Teşekkür @hotkey yaptığı açıklama

için ben iki değişken takas için kod yeteri kadar basit olduğuna inanıyoruz - o başka basitleştirilmesi denemek için değil.

uygulama IMHO en zarif biçimidir:

var a = 1 
var b = 2 

run { val temp = a; a = b; b = temp } 

println(a) // print 2 
println(b) // print 1 

Faydaları:

  • niyet yüksek sesle ve net. Bunu kimse yanlış anlayamaz.
  • temp kapsamda olmayacaktır.
+0

Bu gerçekten bahsettiği genel Java yolu. Yani cevabınız etkili "hayır, daha iyi bir yol yoktur". Sanırım katılıyorum eğilimindeyim. – Michael

+1

@Michael - yorum kabul edildi. 10x. –

+5

Belki de çalıştır {val temp = a; a = b; b = temp} 'biraz daha iyi, çünkü bu biraz daha net bir hale getiriyor ki, bir tek eylem, ve ayrıca 'temp' dış alana sızmıyor (tamamlanma vb. kirletmez). – hotkey

5

bazı gerçekten korkutucu kod yazmak istiyorsanız, böyle bir işlevi olabilir: Bu

a = b { b = a } 

gibi kod yazmak için izin verecek

inline operator fun <T> T.invoke(dummy:() -> Unit): T { 
    dummy() 
    return this 
} 

Bunu NOT yapmamaya dikkat edin. Sadece bunun mümkün olduğunu gösteriyorum.

+1

Daha özlü: evet. Daha sezgisel: ... belki de programlama hakkında öğrendiğim herşeyi unutursam. :) – Michael

+3

Kesinlikle daha sezgisel değil. Bu ** kötü ** kodudur. Sadece biraz eğlendim. –

+1

İnanılmaz derecede korkutucu görünüyor! :) Fonksiyon 'inline' olmalıdır. –

0

Kotlin, mümkünse değişmez verilerin kullanımını teşvik eder (var yerine val kullanılması gibi). Bu, ince hataların değişmesini büyük ölçüde azaltır, çünkü değerler değişmezse, kod hakkında daha akılcı olmanız mümkündür.

İki değeri değiştirmek, değişmez verilerin tam tersidir: Takastan önce veya sonra a değerini mi kastediyorum?

aşağıdaki değişmez şekilde FEC düşünün:

val a = 1 
val b = 2 

val (a2, b2) = b to a 

Bu Pair oluşturur to uzantısı yerleşik fonksiyonu ile birlikte destructuring declarations yararlanarak çalışır. with için iyi bir kullanımdır

0

: Bu benim aslında (aslında karmaşık olmama rağmen) nasıl çalıştığını hakkında çok sert düşünmeye çalışırsanız başımı zarar yapar

var a = 1 
var b = 2 

with(a) { 
    a = b 
    b = this 
} 

println(a) // 2 
println(b) // 1