参考动态到groovy闭包

时间:2013-09-05 06:52:10

标签: grails groovy closures

我必须在500行的高级搜索方法中进行重构。我使用小部件中的闭包来拆分此方法,现在我有很多闭包但我想动态调用它们。

例如:

def listCriteria={ ... }
def textCriteria={ ... }
def booleanCriteria={ ... }

criteria.listDistinct {
    criteries.eachWithIndex { crit, i->
        def criteriaType="${crit.type}Criteria"
        ...
    }
}

我该怎么做?

2 个答案:

答案 0 :(得分:0)

使用方法,您可以从以下字符串动态调用此方法:

def listCriteria() {"list"}
def textCriteria() {"text"}

def string1 = "list"
def string2 = "text"

assert "${string1}Criteria"() == "list"
assert "${string2}Criteria"() == "text"

编辑:

我不知道获得动态引用闭包的优雅方法。

您可以使用控制器类的properties属性来查找所有闭包并调用它们。

def allClosures = this.properties.findAll{Closure.isAssignableFrom(it.value.getClass())}

def callCriteriaClosureByName(name) {
    def criteriaClosure = allClosures.find{it.key == "${name}Criteria"}.value
    if(criteriaClosure)
        criteriaClosure()
}

不太好 - 但应该有用。

答案 1 :(得分:0)

闭包对于确定范围很有用。那么使用地图呢?

class Criteria {
  def listDistinct(closure) {
    closure()
  }
}


closures = [ 
  listCriteria : { "list" },
  textCriteria : { "text" },
  booleanCriteria : { "boolean" }
]


def criteries = ["list", "text", "boolean"]
def criteria = new Criteria()

criteria.listDistinct {
    criteries.eachWithIndex { crit, index ->
        def criteriaType=closures["${crit}Criteria"]
        assert criteriaType instanceof Closure
    }
}