Groovy:方法名称中带有'??'的变量双重问号

时间:2012-12-05 23:49:45

标签: groovy metaprogramming

我有这种模糊的回忆阅读关于groovy存在'??'可用于使方法名称动态化的糖。我曾经认为这是实现grails中动态查找器的方式,但现在我怀疑它是否甚至是常规的我想起来了。举个例子: 我用一些方法创建了一个类

class GroovyExample {

  public def getThingOne(){return '1'}

  public def getThingTwo(){return '2'}

  public def getModifiedThingOne(){
    return this.modify(this.thingOne)
  }

  //  *!!!*  I want to get rid of this second modifying method    *!!!*
  public def getModifiedThingTwo(){
    return this.modify(this.thingTwo)
  }

  private def modify(def thing){
    //...
    return modifiedThing
  }

}

方法名称是否有??糖,我可以用它来干这样的东西:

class GroovyExample {

  public def getThingOne(){return '1'}

  public def getThingTwo(){return '2'}

  //  Replaced the two getModifiedXX methods with a getModified?? method I think I can do....
  public def getModified??(){
    return this.modify(this."${howeverYouReferenceTheQuestionMarks}")
  }

  private def modify(def thing){
    //...
    return modifiedThing
  }

}

这个想法是我可以调用new GroovyExample().modifiedThingTwo,并且只用一个“修改辅助方法”获得相同的答案。这可能吗?被叫??的是什么? (我不能为我的生活谷歌。)而且,我如何在“String中引用??”?

1 个答案:

答案 0 :(得分:1)

我不知道这种语法,但您可以通过methodMissing()here实施该功能。根据该链接,您提到的动态查找器的初始操作机制(尽管我认为在第一次打击方法之后存在一些缓存) - 请注意顶部的警告。

像这样的快速测试可能适合你的账单:

   def methodMissing(String name, args) {
       switch (name) {
           case "getModifiedThingOne":
               return this.modify(this.thingOne)
           case "getModifiedThingTwo":
               return this.modify(this.thingTwo)              
       }
   }