2017-07-20 19 views
5

は、私の知る限り見ることができるように、エルビス演算子を使用する唯一の方法は、このような構文である:エルヴィスオペレータにログを記録しますか?

foo = bar ?: return 

誰でものように、一般的にリターンがある、ログを含める方法を打ち出している場合、私は興味がありました(少なくとも私の経験では)何かが期待どおりに動作しないときに使用された。

ただし、次の構文が無効です。もちろん

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

私は単純に以下の、

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

を行うことができますがエルビス演算子とログインを含む任意の方法はありますか?

答えて

5

ちょうどそれが渡されたラムダを実行する、kotlin-stdlibからrun { ... }機能を使用します。

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

ええ、私たちは同じです。私は 'let 'を使う。あなたの 'return'はそれを外に置かなければなりません。もっと明確になります。 –

+1

これはDavid Furmanの答えが受け入れられるべきだと思います。 – marstran

2

{}がラムダで、あなたには、例えば、それを呼び出す必要があります。

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

ORletとラムダを呼び出すを:

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

あなたは 'run'を意味していますか?自由な 'let'関数はありません。オブジェクトに対して呼び出される必要があります。また、関数を作成してすぐにそのように呼び出すのは、それほど慣用的ではないことがわかりました。 'run'を使うのは、慣用的な方法です。 – marstran

+0

@marstran私は '実行'が悪い方法であるとは決して言わない、私はラムダを呼び出すために 'let'を使うと言った。 –

+0

しかし、ここで説明したように 'let'は動作しません。これは「フリー」機能ではありません。あなたは 'someObject.let {...}'のようなオブジェクト上でそれを呼び出さなければなりません。 – marstran

1

ああ、あなたがしなければならないすべてはこれです:

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

おそらくヌルチェックの場合は標準よりも読みにくいかもしれませんが、少なくともここではどうやって行うのですか?

関連する問題