在Groovy中使用Bang方法

时间:2013-06-05 22:24:57

标签: methods groovy

Groovy在Ruby上有类似于bang方法的东西吗?

来自this blog post

  

在Ruby中,您可以编写名称结尾的方法! (感叹号或“爆炸”)。关于何时以及为什么要这样做,存在很多混乱。

     

!在方法名称中以!结尾!意味着,“这种方法很危险” - 或者更准确地说,这种方法是其他等效方法的“危险”版本,同名减去! “危险”是相对的;的!除非它所使用的方法名称对应于一个类似但非轰然的方法名称,否则它根本没有任何意义。*

this site

  

你会发现许多方法,一个是爆炸,一个没有。那些没有爆炸的人执行一个动作并返回一个刚刚铸造的对象,反映动作的结果(大写字符串,排序数组等)。相同方法的爆炸版本执行操作,但它们就是这样做的:它们不是创建新对象,而是转换原始对象。

3 个答案:

答案 0 :(得分:3)

这不像Groovy中的惯例,就像在Ruby中一样。但是,您可以编写名称包含!等字符的方法,但必须始终像字符串一样引用它:

// define method with quoted name
def 'dangerous!'() {
    // do something dangerous
}

// invoke method with quoted name
'dangerous!'()

答案 1 :(得分:1)

不,groovy(目前从v2.1.4开始)没有这样的东西

答案 2 :(得分:1)

要添加到您的选项中,另一个类似Groovy或类似Java的解决方案是包含一个可选参数,该参数启用就地(a.k.a. dangerous)修改,如下所示:

def processFoo(Foo item, mutate = false) {
    if(!mutate) {
        Foo temp = new Foo()
        // copy item properties
        item = temp
    }
    item.bar = 'blah blah'
    // process item here
    return item
}

processFoo(myFoo) // makes a copy
processFoo(myFoo, true) // modifies original

使用此模式 - 尽管方式相反 - 使用集合上的sort方法。在sort(false)上调用List会阻止更改原始数组。致电sort()sort(true)会直接修改。