2017-08-30 7 views
1

私はKotlinを使ってDSLを作成していますが、インライン関数を持つ受信機オブジェクトを利用して、これを達成するための私の計画は、このコードだったlambda(DSLの場合)の受信機のインフィックス関数を使用

myDslFunction {myReceiversInfixFunc "いくつかの文字列"}

:私は後に私は、構文の例から始めます

fun myDslFunction(builderFunction: MyReceiverObject.() -> Unit) { 
    val receiver = MyReceiverObject() 
    builderFunction(receiver) 
    // do something with receiver 
} 

class MyReceiverObject { 
    infix fun myReceiversInfixFunc(someString: String) { 
     // do something with someString 
    } 
} 

上記の関数とクラススニペットはうまくコンパイルされますが、上記のDSL構文はそうではありません。

fun test() { 
    // desired syntax 
    myDslFunction { 
     myReceiversInfixFunc "some string" // doesn't compile 
    } 

    // not-desired syntax that compiles and works... 
    myDslFunction { 
     this myReceiversInfixFunc "some string" // does compile 
    } 
} 

ここでの主な違いは、セットアップにthisキーワードの追加は中置記法であるが、私はそれが望ましくないことをお勧めし、使用の目的に反し:ここで私は、コンパイルをテストするために書いたいくつかのテスト機能がありますレシーバオブジェクト

ここには何かがありますか?私は希望の構文を達成することはできますか?これを行うのを助けるためにKotlinのコンベンションを見落としているなら私は驚かないでしょう...

答えて

1

Kotlinは受信者が明示的に指定されたinfix関数呼び出しをサポートしているだけなので、この構文を達成することはできません:this myReceiversInfixFunc "someString"

この構文の(かなり古い)言語機能要求があります:KT-1292

関連する問題