【问题标题】:Reference dynamic to groovy closure引用动态到 groovy 闭包
【发布时间】:2013-09-08 21:23:44
【问题描述】:

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

例如:

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

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

我该怎么做?

【问题讨论】:

  • 你真的需要闭包还是也可以使用纯方法?
  • 我需要建立一个大的标准,现在这个方法有500行,我不想用hql重写,因为风险很高

标签: grails groovy closures


【解决方案1】:

使用方法,您可以从这样的字符串中动态调用此方法:

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()
}

不是很好 - 但应该可以。

【讨论】:

  • 我同意你的观点,但是如果我想将它委托给另一个闭包,我该怎么做,因为我正在使用和内部闭包?
【解决方案2】:

闭包有利于范围界定。用地图怎么样?

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
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 2012-07-14
    • 2014-03-15
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多