如何获得在Groovy中调用闭包的类(作用域)?
然而,似乎很奇怪,实际上需要将“this”传递给闭包,以便它能够知道从何处调用它。难道没有更优雅的解决方案吗?此外,即使确实不可能进入TextBox范围,也有可能进入Box范围吗?参见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之前,因为
编辑: 在调用前修复委托:
...
void onClick() {
click(this)
}
...
b.click = {it.content.add("You clicked this box!")}
注意事项:
- 序列4出现在2和3之前,因为此时未调用/调用闭包李>
- 序列1打印
,但序列4打印TextBox
。请注意,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()
}