【问题标题】:Groovy syntax, named block?Groovy 语法,命名块?
【发布时间】:2014-12-06 19:45:55
【问题描述】:

我开始学习 grails 并且有一些我根本没有得到的 groovy 语法,并且据我所知没有记录,因为我不知道它叫什么。

下面代码中的“grails”、“views”和“gsp”是什么?

    grails {
      views {
        gsp { 
          encoding = 'UTF-8'
          // ...
        }
      }
    }

谢谢! p.s.我觉得自己像个白痴,无法弄清楚这一点……

【问题讨论】:

  • 它们是方法调用。
  • 没关系。这些信息足以让我弄清楚发生了什么。谢谢奥利弗

标签: grails groovy


【解决方案1】:

这是 DSL(领域特定语言)代码的示例。在 Groovy 中,许多 DSL 都是作为 Groovy 代码实现的,尽管有时它看起来很时髦。此代码块作为 Groovy 代码运行,如果添加省略的可选括号,则更清楚它是代码:

grails({
   views({
      gsp({ 
         encoding = 'UTF-8'
         // ...
      })
   })
})

如果我们将属性集调用替换为等效的方法调用,则更是如此

grails({
   views({
      gsp({ 
         setEncoding('UTF-8')
         // ...
      })
   })
})

如果您在控制台或作为其他 Groovy 代码的一部分或在 Grails 应用程序中运行它,它将失败,因为没有“grails”方法将闭包作为参数,或类似的“视图”或“gsp”方法,也没有setEncoding(String) 方法。但是当作为 DSL 代码运行时,代码通常在一个闭包内运行,该闭包的 delegate 设置为一个 DSL 辅助类,该类处理生成的 methodMissingpropertyMissing 调用。

此助手查看方法名称和方法参数的数量和/或类型(或属性名称和值类型),如果它们对 DSL 有效,它会执行相应的工作,否则它会抛出 @987654328 @/MissingPropertyException,或特定于 DSL 的异常,或以其他方式处理问题。

在这种情况下,有一个配置 DSL 处理程序将这些方法调用转换为配置属性调用。

Grails 应用程序中使用的其他几个 DSL 以相同的方式工作。域类中的 mappingconstraints 块,BuildConfig.groovy 中的 grails.project.dependency.resolution 块等。所有这些都被评估为 Groovy 代码,缺少的方法/属性调用配置 GORM 映射、约束定义、插件依赖项等.

Programming Groovy 2 是一本特别适合学习 DSL 的 Groovy 书籍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多