class MyGroovy { class InnerGroovy { static def staticClouser = { println "a ${this}" // 閉包定義的類 println "b ${owner}" // 閉包定義的類或物件 println "c ${delegate}" // 預設和 owner 一樣 } def static methodStaticClouser() { def xxx = { println "d ${this}" println "e ${owner}" println "f ${delegate}" } xxx.call() } } static void main(def args) { MyGroovy.InnerGroovy.staticClouser.call() MyGroovy.InnerGroovy.methodStaticClouser() } }
※結果:
a class MyGroovy
b class MyGroovy$InnerGroovy
c class MyGroovy$InnerGroovy
d class MyGroovy
e class MyGroovy$InnerGroovy
f class MyGroovy$InnerGroovy
※
class Animal{} class MyGroovy { static def staticClouser = { println "a ${this}" // 閉包定義的類 println "b ${owner}" // 閉包定義的類或物件 println "c ${delegate}" // 預設和 owner 一樣 } static def methodStaticClouser() { def xxx = { println "d ${this}" println "e ${owner}" println "f ${delegate}" } xxx.delegate = new Animal() xxx.call() } static void main(def args) { MyGroovy.staticClouser.call() MyGroovy.methodStaticClouser() } }
※結果:
a class MyGroovy
b class MyGroovy
c class MyGroovy
d class MyGroovy
e class MyGroovy
f Animal@3745e5c6
※
class Animal { String name } class MyGroovy { Integer id String name Double price def show = { "編號${id},名稱${name},價錢為${price}" } String display() { println show.call() } static void main(String[] args) { MyGroovy m1 = new MyGroovy(price: 50.2, name: '西洋棋', id: 1) MyGroovy m2 = new MyGroovy(name: '象棋', id: 2) Animal a = new Animal(name: '老虎') m1.display() m1.show.delegate = a m1.show.resolveStrategy = Closure.DELEGATE_FIRST // 預設為 0,也就是 OWNER_FIRST m1.display() m2.display() } }
※有點像 javascript 的 call、apply、bind
沒有留言:
張貼留言