2017-07-20 4 views
5

Soweit ich sehen kann, ist der einzige Weg, um den elvis Operator zu verwenden ist mit Syntax wie folgt:Einschließen in den Elvis Operator?

foo = bar ?: return 

ich neugierig war, ob jemand mit einer Art und Weise hat kommen Protokollierung zu umfassen, wie allgemein die Rückkehr benutzt (zumindest in meiner Erfahrung), wenn sich etwas nicht wie erwartet verhält.

jedoch die folgende Syntax ist ungültig:

foo = bar ?: { 
    Log.e(TAG, "Some error occurred.") 
    return 
} 

Natürlich könnte ich einfach tut die folgende,

foo = bar 
if (foo == null) { 
    Log.e(TAG, "Some error occurred.") 
    return 
} 

aber ist es eine Möglichkeit, die auch mit dem Operator Elvis anmelden?

Antwort

5

Verwenden Sie einfach die run { ... } Funktion von kotlin-stdlib, die die Lambda läuft es übergeben wird:

foo = bar ?: run { 
    Log.e(TAG, "Some error occurred.") 
    return 
} 
+1

Ja, wir sind gleich. aber ich benutze 'Let'. Dein 'Return' sollte nach draußen gebracht werden, was klarer wird. –

+1

Ich denke, das oder David Furmans Antwort sollte die akzeptierte sein. – marstran

2

Die {} eine Lambda ist, sollten Sie es aufrufen, zum Beispiel:

//     v--- it is a lambda 
foo = bar ?: return { 
    Log.e(TAG, "Some error occurred.") 
}() // <--- invoke the lambda 

OR einen Lambda mit let aufrufen:

foo = bar ?: return let{ 
    Log.e(TAG, "Some error occurred.") 
} 
+0

Meinen Sie 'run'? Es gibt keine freie "Let" -Funktion. Es muss für ein Objekt aufgerufen werden. Außerdem finde ich es nicht sehr idiomatisch, eine Funktion zu erstellen und sie dann sofort so aufzurufen. Mit 'run' ist der idiomatische Weg imo. – marstran

+0

@marstran Ich sage nie "run" ist ein schlechter Weg, ich sagte, ich benutze 'Let', um ein Lambda aufzurufen. –

+0

Aber 'Let' funktioniert nicht so, wie du es hier beschreibst. Es ist keine "freie" Funktion. Sie müssen es für ein Objekt wie 'someObject.let {...}' aufrufen. – marstran

1

Oh, alles, was Sie tun müssen, ist diese :

foo = bar ?: kotlin.run { 
    Log.e(TAG, "Some error occurred.") 
    return 
} 

Dies kann ist wohl weniger lesbar als ein Standard-NULL-Check, aber hey, zumindest so, wie du es machst.

Verwandte Themen