Kotlin'deki vararg anahtar kelimesi, bir fonksiyonun değişken sayıda argüman almasına olanak tanır. Bu, Java'daki dizilere eşdeğerdir, ancak ek bir sözdizimsel şekerle birlikte gelir.
Kurallar ve kısıtlamalar:
fun foo(vararg numbers: Int)vararg ile argüman, fonksiyonun parametreleri arasında sonuncu olmalıdır (eğer sonrası gereken parametreler varsa, bunlar çağrıda isimli olmalıdır).* kullanarak) ile iletilebilir.vararg ile fonksiyon, bu argüman için değer geçirilmeden çağrılabilir.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // çalışır printAll(*arr) // spread (diziyi açar)
Bir fonksiyonda iki 'vararg' parametresi tanımlamak mümkün mü ya da 'vararg' sonuncu olmayan bir yerde yer alabilir mi?
Cevap: Hayır, Kotlin'de bir fonksiyon tanımında yalnızca bir vararg kullanılabilir ve her zaman pozisyonel argümanlar arasında sonuncu olmalıdır. Eğer sonuna normal bir parametre eklenirse, yalnızca ismi ile geçirilebilir.
Örnek:
fun foo(vararg items: String, prefix: String) // Derleme hatası! // Doğru: fun foo(vararg items: String, vararg items2: Int) // Derleme hatası! // Çalışır: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Hikaye
Genç bir programcı, iki vararg parametresinin aynı anda tanımlanabileceğini yanlış anlamıştı. Fonksiyonun mimarisi, çağrı seviyelerinde birden fazla ayrım gerektiriyordu. Bu, verilerin alma mantığını gözden geçirmeye ve tüm çağrıları yeniden yazmaya neden olan bir yeniden düzenleme zinciriyle sonuçlandı.
Hikaye
Bir Android projesinde, vararg parametresine bir diziyi geçirirken spread operatörü * kullanılmayı unutulmuştu: printAll(arr) yerine printAll(*arr). Sonuç olarak, dizinin elemanlarını yazdırmak yerine, tek bir satırda nesne adresi olarak çıktı verildi ve bu, uygulamanın mantıksal olarak garip davranmasına neden oldu.
Hikaye
vararg ve ek isimli parametreler ile fun foo(vararg a: Int, b: Int) olan bir fonksiyonda, pozisyonel argümanlar ile yapılan çağrılar hatalı olarak algılandı: derleyici vararg için listenin nerede sona erdiğini ve b argümanının nerede başladığını belirleyemedi, bu da derleme zamanında hatalara yol açtı. Bu tür parametreler için argüman isimlerini açıkça kullanmaya karar verdiler.