2015-12-03 85 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