1

Groovy 是否有类似于 Ruby 上的 bang 方法的东西?

这篇博文

在 Ruby 中,您可以编写名称以 ! 结尾的方法。(感叹号或“砰”的一声)。围绕您何时以及为什么想要这样做的问题存在很多困惑。

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

这个网站

你会发现很多对方法,一个有 bang,一个没有。没有 bang 的那些执行一个动作并返回一个新生成的对象,反映动作的结果(大写字符串、排序数组等)。相同方法的 bang 版本执行该操作,但它们是在原地执行操作的:它们不是创建新对象,而是转换原始对象。

4

3 回答 3

3

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

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

// invoke method with quoted name
'dangerous!'()
于 2013-06-06T16:08:09.627 回答
1

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

于 2013-06-06T09:58:38.000 回答
1

要添加到您的选项中,另一种更像 Groovy 或 Java 的解决方案是包含一个可选参数,该参数启用就地(又名危险)修改,如下所示:

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方法一起使用——尽管是以相反的方式。调用ssort(false)可以List防止更改原始数组。调用sort()orsort(true)会直接修改。

于 2013-06-07T03:08:37.577 回答