如何获得在Groovy中调用闭包的类(作用域)?

如何获得在Groovy中调用闭包的类(作用域)?,groovy,closures,Groovy,Closures,然而,似乎很奇怪,实际上需要将“this”传递给闭包,以便它能够知道从何处调用它。难道没有更优雅的解决方案吗?此外,即使确实不可能进入TextBox范围,也有可能进入Box范围吗?参见groovy文档。注意隐式变量:此变量、所有者和委托 编辑: 在调用前修复委托: ... void onClick() { click(this) } ... b.click = {it.content.add("You clicked this box!")} 注意事项: 序列4出现在2和3之前,因为

然而,似乎很奇怪,实际上需要将“this”传递给闭包,以便它能够知道从何处调用它。难道没有更优雅的解决方案吗?此外,即使确实不可能进入TextBox范围,也有可能进入Box范围吗?

参见groovy文档。注意隐式变量:此变量、所有者和委托
编辑: 在调用前修复委托:

...
void onClick() {
    click(this)
}
...
b.click = {it.content.add("You clicked this box!")}
注意事项:

  • 序列4出现在2和3之前,因为此时未调用/调用闭包
  • 序列1打印
    TextBox
    ,但序列4打印
    Main
    。请注意,
    代理
    现在已从
    文本框
    更改为
    (在定义闭包
    b.单击
为了让事情变得更简单,您可以将
onClick()
修改为

Main() {
    String[] a = ["Hello world!"]
    Box b = new TextBox(a)
    println "1:- $b.click.delegate" //Will print TextBox
    b.click = {
        println "2:- $b.click.delegate" //Will print Main

        //Since the closure is now defined inside Main(), 
        //Main becomes the delegate. Reset the delegate to TextBox.
        b.click.delegate = b

        println "3:- $b.click.delegate" //Will print TextBox
        content.add("You clicked this box!")
    }
    println "4:- $b.click.delegate" //Will print Main
    b.onClick()

    println b.content //Will print [Hello world!, You clicked this box!]
}

//Output:
1:- TextBox@c166770
4:- Main@6dbdc863
2:- Main@6dbdc863
3:- TextBox@c166770
[Hello world!, You clicked this box!]

有关详细信息,请参阅。

正如我所说:“我也尝试使用这个,所有者和委托,但它们也都指向Main。”啊,好的。这确实比使用“it”更优雅。虽然我仍然需要传递“this”(click.delegate=this),但我想如果不这样做的话是不可能的。谢谢!嗯。如果您没有正确设置
委托
,这将是不可能的,这是闭包的性质。此外,我们没有向闭包传递任何内容,而是设置它的委托属性。:)(坚持闭包使用父对象而不是被调用方)。
b.click = {content.add("You clicked this box!")}
b.click.delegate = b
Main() {
    String[] a = ["Hello world!"]
    Box b = new TextBox(a)
    println "1:- $b.click.delegate" //Will print TextBox
    b.click = {
        println "2:- $b.click.delegate" //Will print Main

        //Since the closure is now defined inside Main(), 
        //Main becomes the delegate. Reset the delegate to TextBox.
        b.click.delegate = b

        println "3:- $b.click.delegate" //Will print TextBox
        content.add("You clicked this box!")
    }
    println "4:- $b.click.delegate" //Will print Main
    b.onClick()

    println b.content //Will print [Hello world!, You clicked this box!]
}

//Output:
1:- TextBox@c166770
4:- Main@6dbdc863
2:- Main@6dbdc863
3:- TextBox@c166770
[Hello world!, You clicked this box!]
void onClick() {
    click.delegate = this
    click()
}