2016-08-05 46 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。

親切的問候,希望它有幫助!

相關問題