我是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
有人可以指出我的错误,我该如何重新调整?谢谢您提前的时间。
答案 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。
亲切的问候,希望它有所帮助!