2016-08-05 44 views
0

我是斯卡拉的新手。我试图在scala中使用if-else块来尝试返回一个“Int”。如何从一个if-else块而不是scala中的anyVal返回Int?

我的代码看起来likie这样的:

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 

C有人请指出我的错误,我该如何接受?谢谢你的时间提前。

+2

如果'x.getName'既不是'NATIVE'也不是''DATIVE'',你想要什么值? – Dogbert

+0

它应该没有。我的意思是val应该是空的 – Goldengirl

+2

关于'blockNumber',什么是“空的”意思?什么是空号码? –

回答

12

阅读评论之后,我相信你想要的是存储的Option[Int]blockNumber

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) 
+0

是的,或者只是将** map ** ping放在一个Map中并调用get x.getName ... xD(如果equals是唯一的条件) –

+0

这是一个有趣的想法。但这可能是相当“误解”的。我认为比赛解决方案非常合适。 – sascha10000

0

我只是想clearify为什么你会得到AnyVal而不是Int。我不想冒犯,但似乎你也是编程新手......?

根据假设你的代码会做你想做的事,你的第二个If不是很有意思。可以这样写:

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语句互相嵌套。第一个问是否x.getName的值是“NATIVE”,另一个是通常用于处理默认或所有其他情况的其他通用路径。但是如果在那里没有其他的路径可以在单位解决的话,你就可以放一个。如前所述,Int和Unit的常见超类型是AnyVal。

下你只有2例,假设“本土”和“格”你可以写:

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

否则@Dogbert的比赛情况的办法是要走的路。如果有可能没有发生任何情况,您应该使用Option作为@Dogbert所做的。否则,如果您的至少一个案例匹配,您可以使用没有Option的Int。

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

相关问题