2016-11-21 10 views
5

Kotlin default arguments for function and constructor parameters sahiptir. Şimdi, bir işlevNasıl KOTLIN işlevler arasındaki varsayılan argümanlar yaymak için?

fun foo(bar: String = "ABC", baz: Int = 42) {} 

var ve farklı yerlerden diyoruz aynı zamanda tartışmaların geçmek ve bunun yerine varsayılan değeri kullanmayacak şekilde olasılığını açık tutmak istiyoruz.

Ben çağıran fonksiyonlar

fun foo2(bar: String = "ABC", baz: Int = 42) { 
    // do stuff 
    foo(bar, baz) 
} 

fun foo3(bar: String = "ABC", baz: Int = 42) { 
    // do other stuff 
    foo(bar, baz) 
} 

ama her zaman overwriten ve ben tüm çağıran fonksiyonlar varsayılan argümanlar çoğaltılamaz gibi şimdi foo benim varsayılan parametre anlamsızdır varsayılan argümanlar bildirebilirsiniz, biliyorum. Bu çok kuru değil.

varsayılan argümanlar yaymak için daha iyi bir yolu var mı? the guidelines tarafından teşvik olarak

cevap

1

Kendi sorumu cevaplama. Varsayılan değerleri kullanmak için elvis operator birini kullanın Ardından

fun foo2(bar: String? = null: Int? = null) { 
    // do stuff 
    foo(bar, baz) 
} 

fun foo3(bar: String? = null, baz: Int? = null) { 
    // do other stuff 
    foo(bar, baz) 
} 

:

Ne yapabilirsiniz

, null olarak arama fonksiyonları parametreleri beyan ve varsayılan argüman olarak null kullanmaktır null sağlandığında. Bunun yerine bir fonksiyonun bir sınıf dikkatli davranmalıyız

fun foo(bar: String? = null, baz: Int? = null) { 
    val realBar = bar ?: "ABC" 
    val realBaz = baz ?: 42 
} 

, sen yapıcı özelliği çekin ve orada varsayılan değer atayabilirsiniz: Alternatif

class Foo(bar: String? = null, baz: Int? = null) { 
    val bar = bar ?: "ABC" 
    val baz = baz ?: 42 
} 

, sınıf olup olmadığını söylemek Bunun yerine üç eğlenmenin

class Foo(val bar: String, baz: Int) { 
    companion object { 
     fun create(bar: String? = null, baz: Int? = null) = Foo(bar ?: "ABC", baz ?: 42) 
    } 
} 
+0

Neden downvote benzer çözelti elde FooArgs sınıfa foo ve foo2 hareket edeceği yönündeki argümanları kullanmak? –

2

: bir data class ve birincil yapıcı özelliklerini olmasını istiyorsanız, varsayılan değerlerini işlemek için bir fabrika yöntemini ilan edebilir aynı varsayılan argümanlarla seksiyonlar:

fun foo(bar: String = "ABC", baz: Int = 42) 
fun foo2(bar: String = "ABC", baz: Int = 42) 
fun foo3(bar: String = "ABC", baz: Int = 42) 

parametreler olmadan fonksiyonlarını argümanlar alır bir sarmalayıcı sınıf oluşturmak ve var:

class Foo(val bar: String = "ABC", val baz: Int = 42) { 

    fun foo() { /* ... */ } 

    fun foo2() { 
    // ... 
    foo() 
    } 

    fun foo3() { 
    // ... 
    foo() 
    } 
} 
0

sizinle (aynı argümanlar alarak birden fazla işlevi varsa aynı varsayılan değerler), o bu parametreler yakından ilişkilidir ve kendi sınıf içinde yaşaması gerektiği öne süren bir kod koku olduğunu. foo ve/veya foo2 Eğer

data class FooArgs(val bar: String = "ABC", val baz: Int = 42) 

fun foo(args: FooArgs = FooArgs()) { /* ... */} 

fun foo2(args: FooArgs = FooArgs()) { 
    ... 
    foo(args) 
} 

fun foo3(args: FooArgs = FooArgs()) { 
    ... 
    foo(args) 
} 

, foo3 sadece, o zaman daha da üstlenmeden the answer by @nhaarman