2013-03-31 26 views
0

我有如下(注意我已经简化,使问题更简单)如果语句在scala中的else语句中?

def getMyInt(flag1: Boolean, flag2: Boolean): Int = { 
    if (flag1) 0; 
    else { 
    if (flag2) 1; 
    if (flag2) 2; 
    } 

}

问题是,即使内if表达式返回整型,一个包装将返回Unitelse的方法。因此我得到:

Multiple markers at this line 
- type mismatch; found : Unit 
required: Int 

任何提示?

+2

但您的方法不能返回int。如果flag1和flag2都不正确呢? –

+1

如果一个'if'表达式没有'else'部分,就好像你写了'if(cond)value else()'('()'是'Unit'值的文字符号)。 “if”表达式的类型是其每个“边”的LUB(最具体的常见超类型)。 –

回答

8

您可以尝试在Tuple和模式匹配上打包flag1flag2

def getMyInt(flag1: Boolean, flag2: Boolean): Int = (flag1, flag2) match { 
    case (true, _) => 0 
    case (_, true) => 1 
    //Other cases 
} 

此外,控制标志作为参数smell funny。 Martin Fowler对重构标志参数有一个article

+0

为了解决这个问题,我想解决这个问题。 –

3

如果您的inner else语句中没有if语句适用,则不会返回任何内容。更改您的代码如下所示,将编译:

def getMyInt(flag1: Boolean, flag2: Boolean): Int = if (flag1) 0 
    else { 
    if (flag2) 1 
    else 2 
    } 

我改变第二,如果在内部别的,因为两次声明中,如果FLAG2没有意义。