2015-06-05 100 views
0

我已經編寫了下面的代碼來查找與某個鍵對應的值並將其作爲Double返回。Scala中的[Any]模式匹配

def getDouble (key: String, map: HashMap[String, _]) : Double = { 
    if (map contains key) { 
     val o = map get key 
     o match { 
      case Some(i: Int) => return i.asInstanceOf[Int].toDouble; 
      case Some(d: Double) => return d.asInstanceOf[Double]; 
      case Some(s: String) 
       => return augmentString(s.asInstanceOf[String]).toDouble; 
      case Some(int) => return o.asInstanceOf[Int].toDouble; 
      case Some(double) => return o.asInstanceOf[Double].toDouble; 

      case _ => return -1234567.00; 
     } 
    } 
    else { 
     return -1234567.00 
    } 
} 

是什麼case Some(int)case Some(i: Int)之間的區別?

我是否需要同時使用case Some(int)case Some(i: Int)來檢查int類型?

回答

3

Some(int)匹配任何Some,並聲明瞭一個從Option的內容命名Any類型的int變量。 int只是這裏的一個標識符,而不是一個類型。因此,例如Some("String")將與它匹配,並且當您試圖將其作爲Int返回時會拋出異常。

Some(i:Int)僅當o是int,並聲明瞭一個名爲Int類型的i可變匹配。這意味着在這種情況下您不需要asInstanceOf,因爲它已經是Int

你想爲你的代碼是什麼:

def getDouble (key: String, map: HashMap[String, _]) : Double = { 
    val o = map get key 
    o match { 
    case Some(i: Int) => i.toDouble; 
    case Some(d: Double) => d; 
    case Some(s: String) => augmentString(s).toDouble; 
    case _ => -1234567.00; 
    } 
} 

這消除

  1. asInstanceOf秒。正確匹配類型使其不必要,並且通常被認爲是不好的做法。
  2. map contains key檢查,因爲如果它不包含,它將返回None,這被case _ =>捕獲。
  3. 不必要的return s。由於match是函數中的最後一項,它自己的值將自動成爲返回值。
+0

非常感謝您清除疑問。 –