groovy閉包巢狀的小陷阱
阿新 • • 發佈:2019-02-01
groovy的閉包特性極大的方便了程式開發,不過在巢狀閉包要稍微小心一點
先認識一下Groovy閉包中有幾個隱含變數
it:預設的引數名,[color=blue]如果沒有傳引數,it為null,如果自定義了引數名,那就不存在it的定義了[/color]
this : 跟Java一樣,是定義閉包所在類的一個引用,不管有多少層閉包巢狀,this指向的都是最上層的類。
owner : 封閉閉包的物件(如果只有一層閉包就是this,如果有多層閉包巢狀就是含有此閉包的上層閉包)
delegate :預設值是owner,用於閉包的委託呼叫
以一個非常簡單的程式舉例,執行4次列印語句
結果是:nullnullnullnull
正確的寫法是
結果是:0123
嘿嘿,第一個例子中run閉包中it是閉包本身隱含的引數,並不是4.times的it,而呼叫時並沒有傳遞引數,那it的值當然是null了。
當然一般很少出現這種情況,只是在使用執行緒時需要稍微注意一點,不能這樣寫了
先認識一下Groovy閉包中有幾個隱含變數
it:預設的引數名,[color=blue]如果沒有傳引數,it為null,如果自定義了引數名,那就不存在it的定義了[/color]
this : 跟Java一樣,是定義閉包所在類的一個引用,不管有多少層閉包巢狀,this指向的都是最上層的類。
owner : 封閉閉包的物件(如果只有一層閉包就是this,如果有多層閉包巢狀就是含有此閉包的上層閉包)
delegate :預設值是owner,用於閉包的委託呼叫
以一個非常簡單的程式舉例,執行4次列印語句
4.times {
def run = {print it};
run.call()
}
結果是:nullnullnullnull
正確的寫法是
4.times {i->
def run = {print i};
run.call()
}
結果是:0123
嘿嘿,第一個例子中run閉包中it是閉包本身隱含的引數,並不是4.times的it,而呼叫時並沒有傳遞引數,那it的值當然是null了。
當然一般很少出現這種情況,只是在使用執行緒時需要稍微注意一點,不能這樣寫了
4.times {
def run = {print it} as Runnable; //這個不能用it的隱含引數了
Thread.start run;
}