2017-07-02 4 views
1

私はKotlinには本当に新たなんだ、と私がしたいことのようなものであるとき:ちょうどカスタマイズKotlin表現

when { 
    CONDITION0 -> { 
     doSomething0() 
    } 
    CONDITION1 -> { 
     doSomething1() 
    } 
    else -> { 
     throw RuntimeException() 
    } 
} 

のように動作します

when_assert_no_else { 
    CONDITION0 -> { 
     doSomething0() 
    } 
    CONDITION1 -> { 
     doSomething1() 
    } 
} 

後者のコードでは、多くのを示しています私のプロジェクトでは、私は制御フローが例外をスローすることによってelseブロックに達していないと主張したいと思います。

または、when_assert_no_elseの実装を指定すると、whenのキーワードをカスタマイズすることはできますか?

どうぞよろしくお願いします。ありがとうございました。

答えて

1

kotlinには->演算子がないため、上記のコードを書くことはできませんが、代わりにPair<()->Boolean,()->T>を使用して、いくつかの妥協を行うことができます。

fun test(): Int = when_assert_no_else(
     { true } to { 1 }, 
     { false } to { 2 } 
) 



fun <T> when_assert_no_else(vararg cases: Pair<() -> Boolean,() -> T>): T { 
    //   v--- short-circuiting terminal operation 
    return cases.find{ it.first() } 
       .let { it ?: throw RuntimeException() } 
       .second() 
} 
0

私はholi-javaの解決策も考えましたが、すべてのシナリオで十分ではないかもしれません。たとえば、ブランチの副作用を考えてみましょう。

あなたができることは、elseブランチを「抽象化」することです。つまり、静的なクラスを作成し、メソッドを追加することです。when_assert_else。 _when_assert_else_メソッドでは、elseブランチで実行するコードをいつ追加します。現在の戦略を上回る利点は、以外のブランチを変更する場合は、すべてのコードを実行してx回変更する必要があることです。関数呼び出しでは、一度だけ変更する必要はありません。