Groovy - closure

3443 ワード

Summary
  • closure翻译成闭包,ここではまず翻訳しないでください.Groovyの強力な特性です.
  • closureには、コードロジック、最後の行の文、戻り値を表す文、returnキーを使用する文が含まれます.
  • closureをパラメータとして別のclosureに渡すとともに、1つのclosureから1つのclosureを返すことができます.

  • 定義&呼び出し&戻り値
  • デフォルト定義が完了するとコードは実行されず、呼び出されたときにコードを実行する必要があります.
  • 注:closureを呼び出すたびにclosureオブジェクトが作成されます.
  • //      closure        。
    def x = {
        def y = 1
        //    y,      return y
        y
    }
    
    //   
    x.call()
    x()

    义齿
  • パラメータ定義は->記号の前に書かれており、呼び出すときに呼び出す方法と同じようにカッコに直接パラメータを書き込む.
  • パラメータ名は重複できませんが、1つのclosureが別のclosureをネストしている場合は、デフォルトのitで問題ないパラメータがあります.
  • //      
    def closure = { x -> x * 3 }
    
    //   ,   closure         ,       `it`           。
    def closure = { it * 3 }
    
    //     
    def closure = { int a, int b -> a + b }
    
    //        closure
    def closure = { -> 88}
    
    // Closure          param。
    def closure = { String... args1 -> args1.join(" ")}
    println closure("Hello", "Closure!")

    MethodはClosureをparamとして使用
    class Main {
    
        //      method,   Closure      param
        static def methodWithClosureParam(Closure closure){
            closure()
        }
    
        static def methodWithClosureParamEnd(String str, Closure closure){
            println(str)
            closure()
        }
    
        static void main(args) {
            // Closure         groovy.lang.Closure   。
            def closure = { println "Closure!"}
            println closure instanceof Closure  // true
    
            //       ,     Closure     
            methodWithClosureParam {println "Groovy 1"}   //          。
            methodWithClosureParam closure                //       。
            methodWithClosureParam(closure)               //      ,     。
    
            //    method       param   Closure   ,          。
            methodWithClosureParamEnd("Param One", closure)
            methodWithClosureParamEnd("Param One", { println "Closure!"})
            methodWithClosureParamEnd("Param One") { println "Closure!"}
    
        }
    }

    Closureのthisキー
  • Closureが存在するクラスのオブジェクトを表します.
  • class Test {
        void run() {
            // Closure    this       class   Object。
            def whatIsThis = { this }
            println whatIsThis() == this
            println this
        }
    }
    
    class Main {
        static void main(args) {
            def test = new Test()
            test.run()    // true Test@212bf671
            println test  // Test@212bf671
        }
    }

    Closureのownerオブジェクト
  • Closureのownerは、Closureを直接含むクラスまたはClosureオブジェクトです.つまり、Closureが直接クラスに定義されている場合、ownerはクラスのオブジェクトです.ClosureがClosureに直接定義されている場合、ownerはClosureオブジェクトです.
  • class Test {
        class Inner {
            def closure = { owner }
        }
    
        void run() {
            Closure closure = { owner }
            println closure() == this
            println this
        }
    }

    Closureのdelegate
    Closureの一般的な方法
  • closure.getMaximumNumberOfParameters()このclosureで受信可能なパラメータの数を取得します.

  • Reference
    https://www.jianshu.com/p/c02a456e1943