2014-09-03 30 views
3

我可以通過谷歌使用Typeable的演員發現的所有例子都涉及到表達式。這對我有用,但我想知道這是否正常。我是全新的無形:這是我在庫中的第一個導入。無定形類型的模式匹配投射好嗎?

import shapeless.Typeable._ 

val blarg: Future[Any] = (worker ? ListOfLongsPlx(foo)) // I know Any === Try[List[Long]] 
blarg.map { 
    _.cast[Try[List[Long]]] match { 
    case Some(Success(xs)) => xs 
    case Some(Failure(f)) => /* reporting the failure or just default: */ ; List() 
    case None => /*reporting bad cast just a default: */ List() 
    } 
} 

我應該期待這種模式的問題嗎?

要清楚,這是通過我的測試。

回答

5

你的做法是罰款(雖然我不明白,具體代碼是如何工作的,因爲TryFuture),但其實你可以得到的模式匹配一​​個稍微更好的語法與TypeCase

import shapeless.TypeCase 
import scala.util.{ Failure, Success, Try } 

val thing: Any = Try(List(1L, 2L)) 

val TryListLongCase = TypeCase[Try[List[Long]]] 

thing match { 
    case TryListLongCase(Success(xs)) => xs 
    case TryListLongCase(Failure(f)) => println(f); Nil 
    case _ => println("Some unexpected thing"); Nil 
} 

結果將被適當地輸入爲List[Long]

+0

我參考的演員確實會返回一個嘗試,所以在我的真實項目中,我實際上是將一個未來的[try [list [long]]映射到未來的[httpresponse],但是我除去了不相關的細節。 – user3928251 2014-09-04 01:37:24

+0

哦,對 - 我一定是讀得太快了。儘管我的答案中的其他部分仍然存在。 – 2014-09-04 09:09:34