Jenkinsfile/Groovy: 为什么字典和整数的结果是整数?
Jenkinsfile/Groovy: why is result of dictionary AND integer an integer?
在Groovy/Jenkinsfile声明性语法中,为什么对字典、字典和整数对象进行布尔运算AND
的结果是整数而不是布尔值true/false ?
pipeline {
agent any
stages {
stage( "1" ) {
steps {
script {
a = [:]
a.a = [:]
a.a["a"] = "1"
a.a["b"] = "2"
echo "${a}"
echo "${a.a}"
echo "${a.a.size()}"
def my_bool = (a && a.a && a.a.size())
echo "my_bool ${my_bool}"
}
}
}
stage( "2" ) {
when {
expression { true == (a && a.a && a.a.size()) } // Fails because result is integer "2", not boolean "true"
}
steps {
script {
echo "hello, world!"
}
}
}
}
}
我对其他编程语言的偏见使我认为 a && a.a && a.a.size()
应该隐式转换为布尔值。 echo
显示该值为整数 2
.
处理此问题的 Jenkins/Groovy 惯用方法是什么? 即如果一个阶段以“字典为非空且大小为非零”为条件,那么写该条件的惯用 correct/preferred 方式是什么?
更新:
注意:echo "my_bool ${my_bool}"
语句打印“my_bool 2
”。这是 Jenkins 版本 2.222.3。
expression { a?.a?.size() }
甚至
expression { a?.a }
在Groovy/Jenkinsfile声明性语法中,为什么对字典、字典和整数对象进行布尔运算AND
的结果是整数而不是布尔值true/false ?
pipeline {
agent any
stages {
stage( "1" ) {
steps {
script {
a = [:]
a.a = [:]
a.a["a"] = "1"
a.a["b"] = "2"
echo "${a}"
echo "${a.a}"
echo "${a.a.size()}"
def my_bool = (a && a.a && a.a.size())
echo "my_bool ${my_bool}"
}
}
}
stage( "2" ) {
when {
expression { true == (a && a.a && a.a.size()) } // Fails because result is integer "2", not boolean "true"
}
steps {
script {
echo "hello, world!"
}
}
}
}
}
我对其他编程语言的偏见使我认为 a && a.a && a.a.size()
应该隐式转换为布尔值。 echo
显示该值为整数 2
.
处理此问题的 Jenkins/Groovy 惯用方法是什么? 即如果一个阶段以“字典为非空且大小为非零”为条件,那么写该条件的惯用 correct/preferred 方式是什么?
更新:
注意:echo "my_bool ${my_bool}"
语句打印“my_bool 2
”。这是 Jenkins 版本 2.222.3。
expression { a?.a?.size() }
甚至
expression { a?.a }