【问题标题】:Calling method from within a Groovy DSL从 Groovy DSL 中调用方法
【发布时间】:2016-07-19 23:01:05
【问题描述】:

我有一个简单的 Groovy 方法,它使用 Groovy 的 MarkupBuilder 来打印 HTML,下面是非常简化的版本:

void writeHtmlFile(<args>) {
  def writer = new FileWriter(fileName.toFile())
  def html = new MarkupBuilder(writer)

  html.mkp.yieldUnescaped '<!DOCTYPE html>'
  html.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
  html.html {
    head { ... }
    body(id: 'main') {
      h1 "Report Title"
    }      
  }
  writer.flush()
  writer.close()
}

这很好用。假设我想在 h1 之后调用一个方法,它会进行一些计算并为 MarkupBuilder 添加更多内容。如何将被调用方法中定义的元素添加到 MarkupBuilder?这是我尝试过的不会导致异常但也不起作用(生成的 HTML 没有 &lt;h2&gt; 元素):

Closure testNested() {
  println '---'
  return { h2 "here's a subheading" } 
}

// .... other stuff from above example not repeated ...
html.html {
    head {...}
    body(id: 'main') {
      h1 "Report Title"
      testNested()
    }      

我知道我可以轻松地内联。我试图加深对 Groovy 如何在 DSL 中使用闭包和委托的理解,显然我遗漏了一些东西。

【问题讨论】:

    标签: groovy


    【解决方案1】:

    考虑以下代码,它使用 Groovy 2.4.5 对我来说执行得很好。

    构建器模式有点棘手,因为它可以被视为分层数据和/或代码,具体取决于您的观点。通过练习,可以根据需要切换视角。

    import groovy.xml.*
    
    void testNested(def html) {
        html.h2("here's a subheading from testNested")
    }
    
    void writeHtmlFile(def fileName) {
      def writer = new FileWriter(fileName)
      def html = new MarkupBuilder(writer)
    
      html.mkp.yieldUnescaped '<!DOCTYPE html>'
      html.mkp.xmlDeclaration(version: "1.0", encoding: "utf-8")
      html.html {
        body(id: 'main') {
          h1 "Report Title"
          testNested(html)
        }
      }
      writer.flush()
      writer.close()
    }
    
    writeHtmlFile("out.html")
    

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2013-08-10
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多