2016-05-23 16 views
12

Her zaman adlandırılmış argümanlarla çağrılmasını istediğim bazı kurucular ve işlevler var. Bunu gerektirmenin bir yolu var mı?Çağrılı argümanları kullanmak için çağrıları bazı kuruculara/işlevlere nasıl zorlayabilirim?

Birçok parametrelerle ve daha net adlı argümanlar kullanıldığında okumak olanlar için kurucular ve işlevleri için bunu yapabilmek olmak istiyorum

vb ben KOTLIN bunu yapmanın bir yolunu bulduk

+1

İlgili Kotlin hatası: https://youtrack.jetbrains.com/issue/KT-14934 –

cevap

13

1.0 stdlib gelen Nothing kullanılarak: Array<Nothing> olarak

/* requires passing all arguments by name */ 
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {} 
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
//f0(0, 1, 2)      // doesn't compile without each required named argument 

/* requires passing some arguments by name */ 
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {} 
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
f1(0, arg1 = 1, arg2 = 2)   // compiles without optional named argument 
//f1(0, 1, arg2 = 2)    // doesn't compile without each required named argument 

KOTLIN yasadışı, vararg nothings: Nothing için bir değer (herhalde yansıma kısa) geçirilecek oluşturulamaz. Bu biraz bir hack gibi görünüyor ve ben Nothing tip boş dizi için bayt kodu bir yük vardır ama işe yaradığını sanıyorum. Bu yaklaşım, vararg kullanamayan veri sınıfı birincil kurucular için çalışmaz, ancak bunlar private olarak işaretlenebilir ve ikincil kurucular vararg nothings: Nothing ile kullanılabilir.

Bu yaklaşım, ancak, Kotlin 1.1'de çalışmıyor: "Forbidden vararg parameter type: Nothing". :-(

Neyse ki, umut (Nothing benzeri) Özel bir yapıcısı ile kendi boş sınıfı belirlenerek bu deseni çoğaltabilirsiniz. KOTLIN 1.1'de kaybetti ve kullanmıyor ilk parametreyi varargs olarak. Tabii ki, Zorla adlandırılmış argümanların resmi olarak desteklenmesi durumunda bu yapılmazdı:

+14

Bu hiç bir zaman dilin tasarımıyla tasarlanmamıştı Ben senin beceriksizliğini alkışladım :) –

+0

Hiçbir şey dizisini * arrayOf () ile yayabilirsiniz. Ya da yapabilmeliydiniz, bence – Deanveloper

+0

@Deanveloper Sadece denedim. "Desteklenmeyen [Array dönüş türünde yasa dışı" ve "Hiçbir şey 'hiçbir şey' türü türü parametresi olarak kullanamazsınız" alıyorum. Olabilseniz bile, sonraki argümanlar, örneğin, f0 (* arrayOf (), 0, 1, 2) 'farklı bir hataya neden olan yayılma dizisinin içeriği ile birleştirilir:" Tamsayı değişmez beklenen türle uyumlu değil. – mfulton26

İlgili konular