逻辑分支

if - else语句

Groovy支持Java中常见的if - else语法

def x = false
def y = false
 
if ( !x ) {
    x = true
}
 
assert x == true
 
if ( x ) {
    x = false
} else {
    y = true
}
 
assert x == y

Groovy也支持普通的Java“嵌套”if - else if语法:

if ( ... ) {
...
} else if (...) {
...
} else {
...
}

三元操作符

Groovy也支持三元操作符:

def y = 5
def x = (y > 1) ? "worked" : "failed"
assert x == "worked"

参见:elvis操作符

switch语句

Groovy中的switch语句是向后兼容Java代码的,所以你可以让多个case共享一段代码。

然而,有一个不同之处就是,Groovy的switch语句可以处理任意类型的值,并且可以执行不同类型的匹配。

def x = 1.23
def result = ""
 
switch ( x ) {
    case "foo":
        result = "found foo"
        // 让我们继续执行
 
    case "bar":
        result += "bar"
 
    case [4, 5, 6, 'inList']:
        result = "list"
        break
 
    case 12..30:
        result = "range"
        break
 
    case Integer:
        result = "integer"
        break
 
    case Number:
        result = "number"
        break
 
    default:
        result = "default"
}
 
assert result == "number"

switch支持如下类型的比较

  • case值为类时,如果switch值是该类的一个实例,则匹配
  • case值为正则表达式时,如果switch值匹配该正则表达式,则匹配
  • case值为集合(collection)时,如果switch值被该集合所包含,则匹配。这也包括了范围(range)的情况(因为它们也是列表)
  • 如果都不是上述情况,那么当case值等于switch值时匹配

default必须放在switch/case语句的最后,就如Jochen在groovy-user邮件列表中的这个帖子中所指出的,他提到:

“因为Java的switch/case语句并不像Groovy的switch/case语句那样工作。在Java中,case只能取int兼容的常量,在Groovy中,它可以取表达式。在Java中,所有的case共享一个作用域,在Groovy中,每个case都有它自己的作用域。在Groovy中,我们调用isCase方法,在Java中,我们switch的必须是一个数字。譬如,如果我们使用一个闭包作为case值,那么这可能会产生副作用。在一些情况下我们可以让它们表现相同,而且通常当使用Java版的时候,你不会发现在Groovy中有什么不同,除了default的位置和逻辑。”

所以,在Java中default可以放在switch/case语句的任何地方,而在Groovy中default的使用更像一个else语句,而不是指定一个默认情况。

switch的工作原理

case语句通过使用isCase(switchValue)方法来对case值执行一次匹配,这个方法默认是调用equals(switchValue)方法,但是已经被一些类型(如类和正则表达式等)所覆盖。

所以你可以创建你自己的匹配器类型,并添加一个isCase(switchValue)方法来提供你自己的匹配方法。

 
wiki/user_guide/logical_branching.txt · 最后更改: 2008-11-09 20:29 由 johnny
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki