首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用def定义变量和不使用def定义变量有什么区别?

使用def定义变量和不使用def定义变量有什么区别?
EN

Stack Overflow用户
提问于 2016-09-15 23:20:50
回答 2查看 13.3K关注 0票数 31

与Jenkins DSL相比,以下各项有何区别:

代码语言:javascript
复制
def cwd = pwd()

代码语言:javascript
复制
cwd = pwd()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-17 20:07:50

这是范围的不同。在Groovy脚本中,当您为一个没有"def“或其他类型的变量赋值时,它会被添加到"binding”中,即脚本的全局变量。这意味着可以从脚本中的所有函数访问它。这很像在脚本的顶部定义了变量。

如果多个线程在脚本上运行,可能会出现意外的行为。

代码语言:javascript
复制
def a = {
  x = 1
  println x
}
def b = {
  x = 2
  println x
}
new Thread(a).start()
new Thread(b).start()

..。可以产生两个一,两个二,或者一个混合。

相比之下,使用"def“可以生成一个局部变量:

代码语言:javascript
复制
def a = {
  def x = 1
  println x
}
def b = {
  def x = 2
  println x
}
new Thread(a).start()
new Thread(b).start()

..。将始终以任意顺序打印1和2。

票数 37
EN

Stack Overflow用户

发布于 2016-09-16 20:23:41

这是一个很好的问题,但它更像是一个Groovy问题。

据我所知,定义一个没有def关键字的变量可以在脚本中工作,但如果你在类方法中就不行了。此blog post中的示例:

代码语言:javascript
复制
class MyTest {
    def testMethod() {
        y = 3
        println y
    }    
}

t = new MyTest()
t.testMethod()

变量t的定义没有问题,但y定义将抛出异常。

这意味着在我们的上下文(Jenkins pipeline)中,您始终可以在没有def关键字的情况下定义变量,因为您始终处于脚本上下文中,并且您的变量将被绑定到脚本。然而,我认为使用def关键字是一种很好的实践,因为它表明您知道何时实例化您的变量,而且它还可以避免一些重复变量定义的问题(如果您使用def关键字定义变量,至少如果您两次定义同一个变量,则编译将失败)。

最后,来自Groovy documentation

在Groovy中使用def时,实际的类型持有者是Object (因此,您可以将任何对象赋给使用def定义的变量,并且如果一个方法被声明为返回def,则返回任何类型的对象)。

因此,您可能希望具体指定您正在定义的变量的类型。在您的示例中,您可以将cwd定义为:

代码语言:javascript
复制
String cwd = pwd()

它会禁止你做像这样的事情:

代码语言:javascript
复制
def cwd = pwd()
cwd = 1000     // Valid code

String cwd2 = pwd()
cwd2 = 1000    // Will fail compilation
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39514795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档