如何 return 来自 if-else 块的 Int 而不是 scala 中的 anyVal?

How to return Int from an if-else block instead of anyVal in scala?

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

我的代码看起来像这样:

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

我在方法 setBlockNumber() 中使用了这个值 blockNumber 并且出现问题的地方是:

 new setBlockNumber(Option(blockNumber))

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

type mismatch; found : AnyVal required: Int

谁能指出我的错误,我该如何纠正?提前谢谢你的时间。

看完评论,我相信你想要的是在blockNumber中存储一个Option[Int]

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)

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

假设你的代码会做你想做的事,你的第二个 If 并不是很有意义。一个会写:

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

仍然是 AnyVal。因为在 "NATIVE" 或 "DATIVE" 不匹配的情况下,编译器不知道您将传递什么值,因此它是 Unit。 Unit 和 Int 的共同超类型是 AnyVal。

因此您的代码缺少路径:

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

所以你基本上有 2 个相互嵌套的 If 语句。第一个询问 x.getName 的值是否为 "NATIVE",另一个是一般的 else 路径,通常用于处理默认情况或所有其他情况。但是你把另一个 if 放在那里,没有在 Unit 中解析的 else 路径。如前所述,Int 和 Unit 的公共超类型是 AnyVal。

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

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

否则@Dogbert 的匹配案例方法就是可行的方法。如果有可能发生 none 的情况,您应该像@Dogbert 那样使用 Option。否则,如果您的至少一个案例匹配,您可以使用不带选项的 Int。

此致,希望对您有所帮助!