2017-07-04 74 views
1


我是scala的新手,並且正在使用Maps。我做了一個Map,但我不確定如何檢查返回類型並使用它。
我有以下代碼給出以下編譯錯誤「花樣的預計類型不兼容:TestClass.type所需選項[識別TestClass]
如何匹配scala的值地圖

object MapOptionUsage extends App { 
val map : Map[Int, TestClass] = Map[Int, TestClass]() 
var i = 0 
for(i <- 0 to 5){ 
    map.put(i, createObj(i)) 
} 
var a = map.get(5) 

a match { 
    case TestClass => {//dosomething 
    } 
    case None => {//dosomething 
    } 
    } 
    def createObj(i: Int): TestClass = { 
    return new TestClass(i) 
    } 
} 
case class TestClass(val id: Int) 

回答

2

get()回報Option[],並且TestClass需要一個構造函數的參數,所以你要匹配這兩個東西。

case Some(TestClass(x)) => {//dosomething 

BTW,良好的Scala代碼不使用varreturn

+0

它工作。但還有一個問題。我如何在變量Some(TestClass(x))中獲取它,以便我可以使用該內部大小寫塊? – Sandeep

+0

'一些(TestClass(x))'將匹配一個'Option [TestClass]','x'是一個包含'id'值的變量。 'case Some(x)'將匹配任何'Option []','x'是保存'TestClass'的變量(在這種情況下)。 'case x'將匹配任何值,'x'是包含該值的可變值。 – jwvh

1

有幾個問題。

  1. ,你的地圖是不可變的,你不能把東西放在不可變的地圖裏面。 val map : mutable.Map[Int, TestClass] = mutable.Map[Int, TestClass]()

  2. case Some(x)=> {//dosomething由於返回是一個選項,您需要一個類型來匹配。

  3. def createObj(i: Int): TestClass = {需要在您的對象上定義,而不是在您的匹配語句中。

編輯:爲了解決評論。

case Some(x)=> {//dosomething 
    System.out.println(x.id) 
} 

將匹配並創建一個新值,其中x等於Some的內容,即包含在地圖中的TestClass。

+0

對不起,我錯過了導入,但我使用了一個可變映射,並且createObj沒有在匹配中定義。 – Sandeep

+0

2.仍然有效。 1和3在你的問題中是錯誤的。 一些(x)將匹配其中x是您的TestClass一些(TestClass(x))將x與int匹配。 –

+0

不要導入mutable.map,它會混淆讀取你的代碼的scala讀者。 –