2015-12-03 84 views
2

使用Option.fold如果有该Option.fold的建设,将使以下None.**.asInstanceOf[Option[String]**不必要的,我不知道什么时候避免铸造:斯卡拉

def getHiveDir(sqlc: SQLContext, tname: String, partColVals: Seq[(String, String)]): Option[String] = { 
    getHiveDir(sqlc, tname).fold(None.asInstanceOf[Option[String]]) { tloc => 
      // some stuff 
    } 
    Some(someString) 
} 

目前的情况是上述.asInstanceOf[Option[String]]需要或编译出现错误:None不被识别为Option[String]

上面的代码如何重新排列以避免多余的转换?

回答

5

选择您喜欢的:

scala> Option.empty[String] 
res1: Option[String] = None 

scala> None: Option[String] 
res2: Option[String] = None 

scala> None.asInstanceOf[Option[String]] 
res3: Option[String] = None 

您也可以明确定义的类型参数为fold

scala> val o: Option[Int] = None 
o: Option[Int] = None 

scala> o.fold[Option[Int]](None)(_ => Some(2)) 
res5: Option[Int] = None 

有情况下,类型推断只是还没有足够的信息来找出类型。它发生在Haskell等其他语言中。所以常用的方法是指定:的类型,或者像上面例子中那样显式传递类型参数。

+0

“最爱”我想你的意思是“最不丑”。我会去你的第一个 - Option.empty [Type] – javadba

+0

我更喜欢你最后的“选项”。 – javadba

0

出于完整性:

如果您使用scalaz,你可以简单地使用none[String]

+0

我在各种环境中工作,始终如一地支持Scala。但我并不打算让世界通过添加scalaz/shapeless来让非Scala程序员面临更多挑战。这些商店的员工在语言上已经很扎实。 – javadba