2017-06-01 5 views
3

Ruby haben eine etwas wie folgt aus:assign Variable nur, wenn es null ist

@var ||= 'value' 

im Grunde bedeutet es, dass @var wird 'value' nur zugeordnet werden, wenn @var ist noch nicht zugeordnet (zB wenn @var ist nil)

Ich bin auf der Suche nach dem gleichen auf Kotlin, aber bis jetzt wäre die nächste Sache der Betreiber elvis. Gibt es sowas und ich habe die Dokumentation verpasst?

+1

Suchen Sie etwas wie [faul] (https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)? – nhaarman

+0

hmm, nicht wirklich ... Ich meine, in meinem Fall, ich möchte eine 'uid' auf einem' prePersist' JPA Hook zuweisen und ich dachte, dass vielleicht Kotlin einen eleganten Weg hatte stattdessen zu überprüfen, ob 'uid' null ist und zuweisen –

+1

Ich denke, "value = value?: NewValue" ist in der Tat der kürzeste Weg. – nhaarman

Antwort

7

Der kürzeste Weg von Ich denke, kann in der Tat wird mit dem elvis Betreiber:

value = value ?: newValue 

Wenn Sie dies oft tun, eine Alternative ist es, ein delegated property, verwenden, die nur den Wert speichert, wenn seine null:

class Once<T> { 

    private var value: T? = null 

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T? { 
     return value 
    } 

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) { 
     this.value = this.value ?: value 
    } 
} 

Sie jetzt eine Eigenschaft erstellen können, die dies so wie verwendet:

var value by Once<String>() 

fun main(args: Array<String>) { 
    println(value) // 'null' 
    value = "1" 
    println(value) // '1' 
    value = "2" 
    println(value) // '1' 
} 

Beachten Sie, dass dies nicht threadsicher ist und keine Zurücksetzung auf null erlaubt. Außerdem wird der Ausdruck new ausgewertet, während dies bei der einfachen Version von elvis nicht der Fall ist.

+0

tolle Einsichten! Vielen Dank –

+0

Sie wollen wahrscheinlich 'Klasse Once '. Andernfalls könnten Sie 'var value by Once ' verwenden, was verwirrend wäre. –

+0

@ RuckusT-Boom Warum ist das? Es akzeptiert jetzt NULL-fähige Typen, aber im Gebrauch gibt es keinen Unterschied, richtig? – nhaarman

Verwandte Themen