groovy正常的三元运算符可以执行多个运算吗?

groovy正常的三元运算符可以执行多个运算吗?,groovy,jenkins-groovy,Groovy,Jenkins Groovy,我有一个普通的三元运算符,但如果为false,我希望它能进行多于1次的运算 例如: def xxStr = x.x.1.1 def ver = 0 xxStr = (xxStr.contains('foo')) ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.') && ver = xxStr.pop() 当然,这不能作为xxStr.tokenize('.')&&ver=xxStr.pop(

我有一个普通的三元运算符,但如果为false,我希望它能进行多于1次的运算
例如:

def xxStr = x.x.1.1
    def ver = 0
    xxStr = (xxStr.contains('foo')) ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.') && ver = xxStr.pop()
当然,这不能作为
xxStr.tokenize('.')&&ver=xxStr.pop()


不是ligal,但是有什么优雅的方法可以做到这一点吗?

您需要一块可以立即执行的代码

一个选项(显然)是调用将执行所有操作的函数:

def func() {
  println("no")
  println("definitely not")
}
(10 > 20) ? println ("yes") : func()
另一种选择是使用闭包:

​(10 > 20) ? println("yes") :  {​​​​​​​println("no"); println ("definitely not")​​​​​​​​​​​​}.call()
两个版本均打印:

no
definitely not

您需要一块可以立即执行的代码

一个选项(显然)是调用将执行所有操作的函数:

def func() {
  println("no")
  println("definitely not")
}
(10 > 20) ? println ("yes") : func()
另一种选择是使用闭包:

​(10 > 20) ? println("yes") :  {​​​​​​​println("no"); println ("definitely not")​​​​​​​​​​​​}.call()
两个版本均打印:

no
definitely not

三元运算符为变量赋值,因此不能在此处调用赋值表达式。但是您所展示的代码还有更多的问题。例如:

xxStr.tokenize('.') && ver = xxStr.pop()
调用
xxStr.tokenize('.')
后,期望
xxStr
是一个列表是一种误解。此表达式中的
xxStr
仍然是
字符串
,因此对其调用
pop
将抛出
MissingMethodException

强制您的代码为一行程序并不意味着您使用的是优雅的解决方案。在这种情况下,我会说它是相反的。另外,您正在动态上下文中使用
def
(将类型从
String
更改为
List
)。这是不被禁止的,但在大多数情况下,它只会引起混乱。它使您的代码更难理解和推理


我强烈建议将代码分为两部分:一部分负责将字符串标记为数组,另一部分负责弹出版本。它使您的代码更明确,更容易理解。如果在Groovy中有一个内置的易于阅读的解决方案,您可以考虑使用它。但是将这种不必要的抽象层次添加到这样一个简单的用例中并没有什么意义

三元运算符为变量赋值,因此不能在此处调用赋值表达式。但是您所展示的代码还有更多的问题。例如:

xxStr.tokenize('.') && ver = xxStr.pop()
调用
xxStr.tokenize('.')
后,期望
xxStr
是一个列表是一种误解。此表达式中的
xxStr
仍然是
字符串
,因此对其调用
pop
将抛出
MissingMethodException

强制您的代码为一行程序并不意味着您使用的是优雅的解决方案。在这种情况下,我会说它是相反的。另外,您正在动态上下文中使用
def
(将类型从
String
更改为
List
)。这是不被禁止的,但在大多数情况下,它只会引起混乱。它使您的代码更难理解和推理


我强烈建议将代码分为两部分:一部分负责将字符串标记为数组,另一部分负责弹出版本。它使您的代码更明确,更容易理解。如果在Groovy中有一个内置的易于阅读的解决方案,您可以考虑使用它。但是将这种不必要的抽象层次添加到这样一个简单的用例中并没有什么意义

另一个选项是将
一起使用,如:

xxStr = xxStr.contains('foo') ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.').with { pop() }

另一个选项是将
一起使用,如中所示:

xxStr = xxStr.contains('foo') ? xxStr.replace('-foo','').tokenize('.') : xxStr.tokenize('.').with { pop() }

它没有回答OP的问题。他要求提供一个用例,其中三元运算符的
true
分支分配一个变量,而
false
分支分配两个变量。您的
func()
没有分配任何值,它只是将一些内容打印到控制台。好吧,这是一个示例-我知道问题是关于在三元运算符的分支中同时执行多个语句。当然,函数可以获取参数,修改参数,并进行所需的任何计算,闭包也是如此。显然,我认为这可以由OP自己完成。这并没有回答OP的问题。他要求提供一个用例,其中三元运算符的
true
分支分配一个变量,而
false
分支分配两个变量。您的
func()
没有分配任何值,它只是将一些内容打印到控制台。好吧,这是一个示例-我知道问题是关于在三元运算符的分支中同时执行多个语句。当然,函数可以获取参数,修改参数,并进行所需的任何计算,闭包也是如此。显然,我认为这可以由OP他/她自己完成。