我的Grails应用程序中有一个相当大的条件闭包,我想在我的应用程序中的几个地方重用它的一部分。我不想复制我需要重用的部分,而是将其定义为一个单独的闭包,并在需要的地方引用它,但我在语法上有点挣扎。
这是一个简化/缩减版本,但基本上我的标准看起来像这样:
def criteriaClosure = {
and {
// filtering criteria that I'd like to reuse in lots of places
or {
names.each { name ->
sqlRestriction(getFilteringSql(name), [someId])
}
}
if (isOrganisationChild(childDefaultGrailsDomainClass)) {
sqlRestriction(getFilteringSql(domain), [someArg])
}
// filtering criteria that's specific to this particular method
sqlRestriction(getSomeOtherSql(), [someOtherArg])
}
}
def criteria = domain.createCriteria()
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure)
我已经尝试定义我想要作为变量重用的闭包部分,并在我的标准闭包中引用它,但是它定义的限制似乎并未应用。
def reusableClosure = {
and {
or {
names.each { name ->
sqlRestriction(getFilteringSql(name), [someId])
}
}
if (isOrganisationChild(childDefaultGrailsDomainClass)) {
sqlRestriction(getFilteringSql(domain), [someArg])
}
}
}
def criteriaClosure = {
and {
reusableClosure() //this doesn't seem to work
sqlRestriction(getSomeOtherSql(), [someOtherArg])
}
}
我相信这一定是一件非常简单的事情,如果这是一个愚蠢的问题,请道歉。有什么想法吗?
答案 0 :(得分:13)
我认为你必须将代表传递给reusableClosure
,即:
def criteriaClosure = {
and {
reusableClosure.delegate = delegate
reusableClosure()
sqlRestriction(getSomeOtherSql(), [someOtherArg])
}
}