【问题标题】:Groovy syntax for enter/exit block进入/退出块的 Groovy 语法
【发布时间】:2018-03-20 12:33:30
【问题描述】:

有没有办法使用自定义打开和关闭方法来定义块/环境?目前,我有:

script {
   withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
      def sql = Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver")
      sql.rows("SELECT * FROM visualization").each { row ->
         println "row ${row.branch}"
      }
      sql.close()
   }
}

我希望能够做到:

with sqlConnection() { sql ->
   sql.rows("SELECT * FROM visualization").each { row ->
      println "row ${row.branch}"
   }
}

它会相应地自动打开/关闭连接。我是 Groovy 的新手,所以这是我关心的语法。在 Python 中,我会使用对象 __enter__/__exit__ 来执行此操作。

【问题讨论】:

标签: groovy


【解决方案1】:

如果我对您的理解正确,您想要一个新方法 sqlConnection() 来完成 withCredentials 部分吗?

您可以使用闭包参数在其他事情之前或之后做某事。

def sqlConnection(Closure withSqlClosure) {
    withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
        Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql ->
            withSqlClosure(sql)
        }
    }
}

可以这样使用

sqlConnection() { sql ->
    sql.rows("SELECT * FROM visualization").each { row ->
        println "row ${row.branch}"
    }
}

所以调用闭包(withSqlClosure(sql))之前的所有内容都对应于__enter__,调用之后的所有内容都是您的__exit__。请注意,您需要注意异常情况。通常您会希望将闭包调用包装在try { ... } finally { ... } 语句中。在这里,我使用了withCloseable,它为我们做这件事(假设Sql.newInstance 返回一个Closeable)。

为了帮助您的 IDE 并启用 @CompileStatic,您还应该添加一个 @ClosureParams

def sqlConnection(
        @ClosureParams(value = groovy.transform.stc.SimpleType,
                options = ["your.sql.type"]) Closure withSqlClosure) {
    withCredentials([usernamePassword(credentialsId: '...', usernameVariable: 'CONFIG_USER', passwordVariable: 'CONFIG_PASS')]) {
        Sql.newInstance("...", CONFIG_USER, CONFIG_PASS, "com.mysql.jdbc.Driver").withCloseable {sql ->
            withSqlClosure(sql)
        }
    }
}

这里your.sql.typeSql.newInstance的返回类型。

【讨论】:

  • 非常感谢。闭包正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2020-04-10
相关资源
最近更新 更多