Groovy在Ruby上有类似于bang方法的东西吗?
在Ruby中,您可以编写名称结尾的方法! (感叹号或“爆炸”)。关于何时以及为什么要这样做,存在很多混乱。
!在方法名称中以!结尾!意味着,“这种方法很危险” - 或者更准确地说,这种方法是其他等效方法的“危险”版本,同名减去! “危险”是相对的;的!除非它所使用的方法名称对应于一个类似但非轰然的方法名称,否则它根本没有任何意义。*
你会发现许多方法,一个是爆炸,一个没有。那些没有爆炸的人执行一个动作并返回一个刚刚铸造的对象,反映动作的结果(大写字符串,排序数组等)。相同方法的爆炸版本执行操作,但它们就是这样做的:它们不是创建新对象,而是转换原始对象。
答案 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)
会直接修改。