2017-10-04 131 views
1

这是一个命令模式来编写詹金斯管道这样的代码:为什么jenkinsfile以这种方式使用闭包?

def call(body) {  
    def config = [:] 
    body.resolveStrategy = Closure.DELEGATE_FIRST 
    body.delegate = config 
    body() 
} 

我不知道怎样来写这个简单,但这种封闭得到隐含的进口,并且可以通过.groovy文件的文件名被称为它生活在

我这样称呼它:

MyClosure { myarg = 'sdfsdf' } 

我不能完全肯定这是什么做的。这是做call(body),然后分配body作为代表。所以这意味着我通过它的关闭是代表,但是不仅仅是主人?华?我困惑。

回答

3

运行时,它将创建一个空映射(config)。然后它通过设置其resolveStrategy为常量Closure.DELEGATE_FIRST来告诉关闭(body)首先查看代理以查找属性。然后它将config映射指定为正文对象的委托。

现在,当您执行body()闭包时,变量的作用域为config映射,因此现在为config.myarg = 'sdfsdf'

现在后面的代码中,您可以轻松访问config中的值映射。

body所有者,默认情况下是委托。但是当您将代理切换为config,并且告诉它首先使用委托时,您将获得变量config的范围。

+0

如果我没有将代理切换到配置会怎样?身体将是代表?如果是这种情况,我将无法访问传入的myarg? – red888

+0

对。 'body'是一个指向匿名函数的变量。如果你没有改变委托,那么myarg会在该函数的范围内被设置为'sdfsdf',并且只要该函数退出,该值就消失了。但是,如果您委托给地图对象,它将在该对象上设置属性,您现在可以获取该属性。 –

+1

其实身体不指向一个功能。这是关闭的一个实例。 – Opal

相关问题