- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下示例改编自“Groovy in Action”
class Mother {
Closure birth() {
def closure = { caller ->
[this, caller]
}
return closure
}
}
Mother julia = new Mother()
closure = julia.birth()
context = closure.call(this)
println context[0].class.name // Will print the name of the Script class
assert context[1] instanceof Script
this
的值闭包内部是最外层范围(即声明
julia
的范围)。我是否正确地假设
this
在闭包内部计算闭包被调用的范围? this
和 caller
指的是同一个范围? 最佳答案
“this
”在 Groovy 中的 block 中总是意味着周围的类(实例)(无论是普通的 Java 类 block 还是闭包)。 “owner
”是闭包的一个属性,指向嵌入对象,它要么是一个类(实例),然后与“this
”相同,要么是另一个闭包。我会完全忘记这部分的范围。所以在上面的例子中,“这个”指的是一位母亲是正确的。
现在让事情变得复杂......“this”和隐含的 this 在 Groovy 中是不一样的。所以如果你有一个闭包{foo()}
和 {this.foo()}
你可以得到不同的结果。 this.foo()
将始终解析为嵌入类,而只有 foo()
将使用 Groovy 元对象协议(protocol) (MOP) 解决,并且可以指向完全不同的东西。例如,对于标准的 Groovy 构建器,构建器可以在该闭包上设置一个委托(delegate)并捕获方法调用。无论如何......这就是为什么这部分被称为动态范围。
历史背景:
在 Groovy 1.0 之前,“this”是 Closure 对象本身。但因实际调用 this.foo()
而被更改如果构建器确实捕获了所有调用,则变得不可能。那么您将无法再从构建器中调用本地方法。有很多尝试改变标准解决策略 - 也有很大的情感讨论。但最后,将“this”更改为引用嵌入类是解决问题的一个简单方法,并且更符合来自 Java 的人,而且如果您坚持,它可以让您轻松绕过 MOP。
关于Groovy:闭包内 'this' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820084/
我正在尝试对 StockData 表执行 OHCL sql 查询 (SQL Server 2012)。每天有数千行添加到表中,我想获取每天的开盘价、最高价、最低价和收盘价数据。 建表sql如下:
我是一名优秀的程序员,十分优秀!