非常简单明了的问题:
假设我们有这个管道(我认为没有一个更简单的例子):
node {
env.someEnvVariable = false
boolean asBoolean = env.someEnvVariable ?: false
def asDef = env.someEnvVariable ?: false
echo "asBoolean: $asBoolean" // prints true because of Jenkins
echo "asDef: $asDef" // prints false
}
为什么????
将变量定义为boolean
会使Jenkins为其指定一个真值,但将其定义为def
会为其指定真正的假值
Jenkins认为true
的价值来自哪里?
编辑:另一个例子:
node {
env.someEnvVariable = false
boolean someBoolean = false
def someVar = false
echo "envVar: ${env.someEnvVariable}" // prints false
echo "someBoolean: ${someBoolean}" // prints false
echo "someVar: ${someVar}" // prints false
if (env.someEnvVariable != null) {
someBoolean = env.someEnvVariable
someVar = env.someEnvVariable
}
echo "envVar: ${env.someEnvVariable}" // prints false
echo "someBoolean: ${someBoolean}" // prints true because of hack
echo "someVar: ${someVar}" // prints false
}
答案 0 :(得分:2)
我的假设是,当您分配环境变量时,它被解释为字符串'false'
。这意味着在两种情况下,您都尝试分配字符串,但如果字符串不为空,则将字符串分配给boolean
变量将被解释为true。
三元运算符以相同的方式工作,检查环境变量是否为真(非空)。它并非如此,它本身就会返回变量。
答案 1 :(得分:0)
这是由于“常规事实”:一个非空字符串断言为true
。
https://docs.groovy-lang.org/latest/html/documentation/core-semantics.html#Groovy-Truth