如何从scala中的if-else块而不是anyVal返回Int?

时间:2016-08-05 07:53:29

标签: scala if-statement return-value

我是Scala的新手。我试图在scala中使用if-else块来尝试返回" Int"。

我的代码看起来像这样:

val blockNumber = {
    if(x.getName equals ("NATIVE")) 0
    else {
       if(x.getName equals ("DATIVE")) 1
    }
}

我在方法blockNumber中使用此值setBlockNumber(),并在出现问题时使用此值:

 new setBlockNumber(Option(blockNumber))

但每次我尝试这样做时,该方法都会出错:

type mismatch; found : AnyVal required: Int

有人可以指出我的错误,我该如何重新调整?谢谢您提前的时间。

2 个答案:

答案 0 :(得分:12)

阅读评论后,我相信你想要的是Option[Int] blockNumber中存储{/ 1}}:

val blockNumber = if (x.getName == "NATIVE") {
    Some(0)
} else if (x.getName == "DATIVE") {
    Some(1)
} else {
    None
}

new setBlockNumber(blockNumber)

我还会使用match重写此内容:

val blockNumber = x.getName match {
    case "NATIVE" => Some(0)
    case "DATIVE" => Some(1)
    case _ => None
}
new setBlockNumber(blockNumber)

答案 1 :(得分:0)

我只想澄清为什么你得到AnyVal而不是Int。我不想进攻,但看起来你也是编程的新手......?

假设您的代码可以执行您想要的操作,那么您的第二个代码并不是真正有意义的。一个人会写:

val blockNumber = {
        if(x.getName equals ("NATIVE")) 0
        else if(x.getName equals ("DATIVE")) 1
    }

哪个仍然是AnyVal。因为在这种情况下,如果" NATIVE"或者" DATIVE"不匹配编译器不知道你将提供什么价值,因此它的单位。 Unit和Int的常见超类型是AnyVal。

所以您的代码缺少路径:

val blockNumber = {
    if(x.getName equals ("NATIVE")) 0
    else {
       if(x.getName equals ("DATIVE")) 1
       else Unit
    }
}

所以你基本上有2个If-Statements互相嵌套。第一个询问x.getName的值是否为" NATIVE"另一个是通用的其他路径,通常用于处理默认或所有其他情况。但是如果你没有在Unit中解决的else路径,那么你可以放置另一个。如前所述,Int和Unit的常见超类型是AnyVal。

假设您只有2个案例" NATIVE"和" DATIVE"你可以写:

val blockNumber = if(x.getNmae equal ("NATIVE")) 0
else 1

否则@Dogbert的匹配案例方法是可行的方法。如果有可能没有任何一种情况发生,你应该使用Option作为@Dogbert。否则,如果您的案例中至少有一个匹配,则可以使用不带选项的Int。

亲切的问候,希望它有所帮助!