Groovy:是否可以将assert与Elvis运算符结合使用?

时间:2018-12-18 19:27:01

标签: groovy

我想根据断言结果递增值:

def a = 1 
def b = 1
def c = 0
def d = 0

(assert a==b, "Mismatch") ? (c++) : (d++)

有可能吗?

2 个答案:

答案 0 :(得分:2)

您误解了一个重要部分-assert不是函数,它不返回任何值。这是Groovy的(和Java)关键字(语句),如果右侧的表达式的计算结果为false,则会引发异常,但不会返回任何结果。但是,您可以按照设计使用ternary operator的方式来获得预期的结果:

def a = 1
def b = 1
def c = 0
def d = 0

a == b ? (c++) : (d++)

println "c = ${c}, d = ${d}"

输出:

c = 1, d = 0
  

您可以在Groovy的官方"Testing Guide, chapter 2.1 Power Assertions"中阅读有关使用断言的更多信息。

答案 1 :(得分:2)

如果您真的想“忽略” assert并继续,则可以捕获它引发的异常。例如

 def a = 1
 def b = 1
 def c = 0
 def d = 0

 try {
    assert a==b, 'Mismatch'
    c++
 }
 catch (AssertionError e) {
    d++
 }

 println([a,b,c,d])

如果某些外国代码要求我这样做,我只会使用这样的策略。这是非常复杂的代码,除非您想滥用断言功能为您生成一个不错的“警告”日志消息。