【问题标题】:Groovy: Usage of 'it' with closuresGroovy:在闭包中使用“it”
【发布时间】:2021-05-07 07:44:59
【问题描述】:

我想知道如何将隐式变量“it”传递给闭包。 见以下代码:

def myfunc(String name, Closure cl)
{
    println("name: ${name}")
    cl.call()
}

list = ['a', 'b']

list.each
{
    println("it1: ${it}")
}

list.each
{
    myfunc("f1")
    {
        println("it2: ${it}")
    }
}

list.each
{
    p ->
    myfunc("f2")
    {
        println("p: ${p}")
    }
}

结果输出是:

it1: a
it1: b
name: f1
it2: null
name: f1
it2: null
name: f2
p: a
name: f2
p: b

如何在第二个版本 (f1/it2) 中将隐式变量 it 传递给闭包?目前它是“空的”。 我想在第二个版本的“它”中实现“a”、“b”。

问题的背景是,在 Jenkins 流水线中,以下代码

    mylist = ['a1', 'a2']
    mylist.each {
        dir ("xxxx") {
            echo "it in xxxx is ${it}"
        }
    }

打印出it 的值“a1”和“a2”。 这不符合 it 绑定到最外层闭包的理解。

在 Jenkins 的情况下,行为似乎有所不同。 我想实现同样的行为,我想知道如何做到这一点。

感谢所有反馈!

最好的问候

马蒂亚斯

【问题讨论】:

  • 不可能,因为有两个嵌套的闭包。 it 是对当前闭包参数的引用,无法访问“父”闭包参数。
  • 正如@dagget 所说,这是不可能的。但是,我很好奇你想要完成什么。为什么需要结合这些值?如果您可以解释目标,也许这里的某人可以帮助您解决根本问题。
  • 我已经扩展了我的问题。 Jenkins 管道中的行为似乎与我在 Groovy 脚本中得到的不同。
  • dir 来自 jenkins 不是一个函数——它是一个 jenkins Step,你的 groovy 函数示例不适用。您必须检查它是否可以通过 groovy 定义的自定义步骤rubix.nl/… 来实现,或者考虑创建自定义插件。
  • @daggett :谢谢,这回答了我的问题。您能否将您的评论作为答案,以便我可以关闭该主题。

标签: groovy jenkins-pipeline jenkins-groovy


【解决方案1】:

来自 jenkins 的dir 不是函数 - 它是 jenkins 步骤,您的 groovy 函数示例不适用。

你必须检查它是否可以通过 groovy 定义的自定义步骤来实现 https://rubix.nl/jenkins-creating-a-custom-pipeline-step-in-your-library/

或考虑创建自定义插件。

顺便说一句,这是dirjenkins step的来源:https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/steps/PushdStep.java

【讨论】:

  • 谢谢,我已经扩展了我的问题以提供有关背景的更多详细信息。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2021-10-23
  • 2013-11-06
  • 2013-02-26
相关资源
最近更新 更多