【问题标题】:Groovy: rewriting two functions which differ by one line only into one?Groovy:将两个仅相差一行的函数重写为一个?
【发布时间】:2023-03-28 08:51:02
【问题描述】:

假设我们有一个如下所示的循环:

for (some a in someArray) {    
 doSomething

 someClassA.set(fieldA, fieldB, fieldC)

 doSOmething
}

for (some a in someArray) {    
 doSomething

 someClassB.set(fieldX, fieldY, fieldZ)

 doSOmething
}

Groovy 中是否可以不复制 2 循环块的描述?

换句话说,我可以写一些单一的函数来完成这两项工作吗?

【问题讨论】:

  • 就这段代码而言,很难概括它。我们需要知道那些field* 变量是从哪里来的。

标签: groovy closures


【解决方案1】:

您可以使用封装单行逻辑的闭包并将其传递给方法,该方法循环并执行块:

def doA = { some -> some.set(fieldA, fieldB, fieldC) }
def doB = { some -> some.set(fieldX, fieldY, fieldZ) }


def doLoop(closure) {
    for ( a in someArray) {    
        doSomething

        closure(a)

        doSOmething
    }
}

doLoop doA

doLoop doB

【讨论】:

  • 谢谢,但如果 fieldX 不是原语,而是来自 doLoop 的某些变量的值,我似乎无法编译它。例如 fieldB 实际上是 someArray[3] 并且它不会编译。我说的对吗?
  • @MiamiBeach 如果你想出一些代码会更容易提供帮助。
【解决方案2】:

Groovy 支持鸭式打字。这意味着如果您的两个类设置方法具有相同的签名,您只需在两个类上调用它:

class A {
  String x
}

class B {
  String x
}


list = [new A(), new B()]

def loop(def list) {
  for (e in list) {
    e.setX("myX of ${e.class}")
    println e.x
  }
}

loop(list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2016-01-29
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多