2017-06-01 5 views
3

nullである場合にのみ、このようなものがあります:割り当て変数、それはRubyの1に

@var ||= 'value' 

を基本的には、それが(@varnilある場合など)を@varがまだ割り当てられていない場合にのみ@var'value'が割り当てられますことを意味し

私はKotlinで同じものを探していますが、これまでのところ、最も近いものはelvis演算子です。そんなことがありますか?私は文書を見逃しましたか?私は考えることができる

+1

あなたは[lazy](https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)のようなものをお探しですか? – nhaarman

+0

ええと、実際はそうではありません...私の場合、 'prePersist' JPAフックに' uid'を割り当てたいのですが、 'uid'がnullで、assign –

+1

私は 'value = value?:newValue'は本当に最短の方法だと思います。 – nhaarman

答えて

7

最短の方法は、実際にエルビス演算子を使用している:

value = value ?: newValue 

これを頻繁にする場合、代替がそのnull場合にのみ値を格納delegated propertyを、使用することです。

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 
    } 
} 

あなたは今では同じようにこれを使用してプロパティを作成することができます。

var value by Once<String>() 

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

これはスレッドセーフではないため、nullに設定することはできません。また、これはnewの式を評価しますが、単純なelvis演算子のバージョンはそうではありません。

+0

偉大な洞察力!ありがとうございました –

+0

おそらく 'class Once 'が必要です。それ以外の場合は、 'var value by Once 'を使用すると混乱します。 –

+0

@ RuckusT-Boomそれはなぜですか?今はnull可能な型を受け付けていますが、使い方に違いはありません。 – nhaarman

関連する問題