2017-12-24 14 views
6

Kotlinでは、別の変数がnullでない場合にのみ代入を行いたいと思います。私は2つの簡潔な方法を考えることができます。右辺がヌルでない場合にのみ、より適切な方法を割り当てることができますか?

fun main(args: Array<String>) { 
    var x: Int? = null 
    var n = 0 

    // ... do something ... 

    x?.let { n = it } // method 1 
    n = x ?: n   // method 2 
} 

しかし、彼らは私がそれらをしなければならない頻度を考えると、十分に簡潔に感じることはありません。最初の方法は過度のようです。 2番目の方法は、?:の後に式を必要とすることにうんざりしています。

私は良い方法がなければならないと思っています。n =? xのようなものでしょうか?またはn = x??ある?

+8

' Fi回線X操作でシミュレートカスタム' にしてみてください。 – yole

答えて

0

次があります:

val x: Int? = null 
val n: Int = x ?: return 

これはnが割り当てられていない場合であっても、完全に罰金コンパイルします。 「割り当て」の後にnを使用する通話も許可されます。コンパイラはnIntであることを知っているので、それは問題ありません。ただし、スコープのreturnが割り当てられているため、割り当て後の行は決して呼び出されません。あなたが望むものに応じて、それはノーオペレーションです。 nを割り当てることができなかったので続行できませんので、ただ返してください。

もう1つのオプションはval n: Int = x!!で、の場合はNullPointerExceptionとなります。 Kotlinはnull許容性を処理するためのよりクリーンなメソッドを提供しているので、この方法はお勧めしません。

+0

私の実際の使用例はこれです:私はJavaライブラリの上にラッパー関数(Kotlin)を書いています。パラメータがnullでない場合、その値は基礎となるオブジェクトの対応するフィールドに割り当てられます。 nullの場合、何も行われず、デフォルト値のままフィールドが残されます。設定するフィールドが複数あるため、途中で戻ることはオプションではありません。しかし、調査と提案に感謝します。 –

+1

次に、あなたのオリジナルの方法2が最高だと思います。それは明確で、短く、シンプルで、あなたが望むものを達成します。 – Erik

1

infix Kotlinでこの操作を実行するための専用の構文はありません

// define this 
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this 

/////////////////////////////////////////////////////////// 
// Demo using 

// Now, Kotlin infix-style 
fooA assignFromNotNull fooB 
barA assignFromNotNull barB 
bazA assignFromNotNull bazB 

// Old code, Java if-style 
if (fooB != null) { 
    fooA = fooB; 
} 
if (barB != null) { 
    barA = barB; 
} 
if (bazB != null) { 
    bazA = bazB 
} 
+0

私は、中置関数の定義で何をしようとしているのか理解しています。しかし、これらの3行のKotlinコードは何ですか?私は明らかにKotlinのメタデータについてよく分かりません。 –

+0

私のプロジェクトからデモ・コードがコピーされました。私はそれを清潔にして答えを明らかにする。 – Raymond

関連する問題