Groovy中静态初始化块的用途是什么?

Groovy中静态初始化块的用途是什么?,groovy,geb,Groovy,Geb,Groovy中静态初始化块的用途是什么。Geb为什么使用它?如果它的使用与Java中的相同,那么如何在这样的情况下初始化未声明的字段 class ManualsMenuModule extends Module { static content = { toggle { $("div.menu a.manuals") } linksContainer { $("#manuals-menu") } links { linksContain

Groovy中静态初始化块的用途是什么。Geb为什么使用它?如果它的使用与Java中的相同,那么如何在这样的情况下初始化未声明的字段

class ManualsMenuModule extends Module { 
    static content = { 
        toggle { $("div.menu a.manuals") }
        linksContainer { $("#manuals-menu") }
        links { linksContainer.find("a") } 
    }

    void open() { 
        toggle.click()
        waitFor { !linksContainer.hasClass("animating") }
    }
}

我不是Geb专家,我只能解释代码的groovy含义

首先,它不是java中的静态初始化块。在这些行中,
static content={…}
为静态变量分配了一个闭包实例,该闭包实例将在以后进行计算和执行(因此,
lazy

闭包表示Geb的Groovy Builder的一部分,Geb框架调用它来注册/执行某些任务

没有Java对等体可以达到同样的效果,这就是为什么基于groovy的框架非常适合用于测试目的,并且它们遵循一般的经验法则:

测试代码应该比被测试的代码更抽象

更新:

这一行:

toggle { $("div.menu a.manuals") }
可以像这样重写

toggle( { $("div.menu a.manuals") } )


所以这是一个方法调用,而不是赋值。在groovy中,您可以在某些情况下省略括号。

Geb手册的第页提供了一些问题的答案


DSL是通过使用和修改分配给静态
内容
字段的闭包来实现的。如果您对深入挖掘感兴趣,那么您可以随时查看中的实现。

感谢您的回答@injecteer。那么,内容变量就是闭包的闭包(我是说“toggle”、“linkscocontainer”和“links”是什么意思)或者我错了。
content
闭包包含一个可能包含嵌套闭包的构建器代码。作为一个例子,我们称之为以下结构:“toggle{$(“div.menu a.manuals”)}?不知道)。我只能推测,一些类似jquery的选择器被称为I,意思是“toggle{$(“div.menu a.manuals”)}”与“toggle({$(“div.menu a.manuals”)}”)相同。那么,我们如何调用一个未定义的方法呢?
def a = { $("div.menu a.manuals") }
toggle a