2017-11-16 2 views
3

私たちは拡張機能を持っていますが、KotlinのReceiverでLambda'sの目的は何ですか?以下ReceiverでLambda'sの目的は何ですか?

2つの関数は、しかし、最初のものは、より読みやすく、短くて、同じことを行う:

fun main(args: Array<String>) { 
    println("123".represents(123)) 
    println(123.represents("123")) 
} 

fun String.represents(another: Int) = toIntOrNull() == another 

val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()} 

答えて

6

ラムダ受信機と基本的に拡張関数とまったく同じですが、彼らは、プロパティに格納するだけのことができますよ関数に渡されます。この質問は本質的に「私たちが機能を持つときにラムダの目的は何ですか?」と同じです。答えはまったく同じです。コード内のどこにでも匿名の拡張関数を素早く作成することができます。

これには多くの良いユースケースがありますが(特にDSLsを参照してください)、ここでは簡単な例を挙げておきます。例えば

は、あなたがこのような機能を持っているとしましょう:この関数を呼び出す

fun buildString(actions: StringBuilder.() -> Unit): String { 
    val builder = StringBuilder() 
    builder.actions() 
    return builder.build() 
} 

は次のようになります。

    :カップル興味深いことは、これが有効に

    val str = buildString { 
        append("Hello") 
        append(" ") 
        append("world") 
    } 
    

    あります

  • ラムダの中でbuildStringに渡すと、あなたは新しい範囲にあります。新しいメソッドとプロパティがあります利用可能です。この特定のケースでは、StringBuilder型のメソッドをどのインスタンスでも呼び出すことなく使用できます。
  • これらの関数呼び出しが実際に行われるStringBuilderインスタンスは、あなたが管理するものではありません。つまり、関数を作成して拡張関数を呼び出す関数の内部実装までです。
  • これは、この関数は、ちょうどあなたが一度に渡された関数を呼び出すよりもはるかに多くを行うことができることを、以前のポイントから次の - それは後で使用するために保管し、様々なStringBuilderインスタンス上で、複数回それを呼び出すことができ、など
+1

偉大な答え! +1 – hotkey

+0

ありがとう、素晴らしい!!!私はそれがより複雑な機能だと思った) –

関連する問題