Scala

时间:2015-06-05 19:59:15

标签: scala pattern-matching

我编写了以下代码,用于查找与键对应的值并将其返回为Double。

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?

1 个答案:

答案 0 :(得分:3)

Some(int)匹配任何Some,并从int的内容声明名为Any的{​​{1}}变量。 Option只是一个标识符,而不是类型。因此,例如int将与它匹配,并在您尝试将其作为Some("String")返回时抛出异常。

Int仅在Some(i:Int)为int时匹配,并声明类型为o的名为i的变量。这意味着在这种情况下您不需要Int,因为它已经是asInstanceOf

您想要的代码是:

Int

删除

  1. 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; } } s。正确匹配类型使它们不必要,并且它们通常被认为是不好的做法。
  2. asInstanceOf检查,因为如果它未被包含,它将返回map contains keyNone抓住。{/ li>
  3. 不必要的case _ => s。由于return是函数中的最后一个,因此它自己的值将自动成为返回值。