2014-09-25 40 views
3

我寫它有三個可能的返回狀態的方法:返回Try [Option [String]]是否合理?

  • 操作可以失敗與異常
  • 操作可以用字符串結果
  • 操作可以成功成功沒有結果

返回類型Try[Option[String]]看起來是否正確?還是有更好的選擇?

+1

如果這就是你想要的粒度,那就是我要走的路。所以是的,這是有道理的。 – 2014-09-25 01:38:44

+1

是否需要在標準庫中,或者庫是否可以?因爲這是我喜歡Lift的['Box {Full,Empty,Failure}'](http://liftweb.net/api/26/api/index.html#net.liftweb.common.Box)類型的原因之一。 (我相信斯卡拉有更好的東西,我只是不太瞭解斯卡拉茲)。 – 2014-09-25 01:47:33

+0

Scalaz有'NonEmptyList [Char]',你可以在這裏看到一些用法:https://github.com/scalaz/scalaz/blob/series/7.2.x/example/src/main/scala/scalaz/example/StringUsage .scala#L8,雖然你可能會返回'Try [Option [NonEmptyList [String]]]'這可能有點多,但至少你不必擔心空字符串:) – Noah 2014-09-25 01:54:49

回答

1

你的方法非常好。另一種方法是定義你自己的情況下,類/對象

sealed trait Result 
case class OperationFailed(e: Exception) extends Result 
case class SuccessValue(str: String) extends Result 
case object SuccessNoValue extends Result 

編輯:
這種方法可以與模式匹配更好地工作,特別是如果你使用的是阿卡。

val f: Any => Any = { case x: Try[Option[String]] => x.get.get.toUpperCase } 
f(Try(Some("x"))) 
f(Try(Some(5))) // Throws java.lang.ClassCastException 

上面將顯示以下警告

警告:非可變類型參數選項[字符串]在式圖案 scala.util.Try [選項[字符串]]處於未選中狀態,因爲它由 擦除消除

+0

我不知道爲什麼你必須添加「你自己的類型」的想法;否則它會是我的+1。 – 2014-09-25 09:09:18

+0

這取決於你的口味。對我來說,使用平面類型覆蓋所有情況的可讀性要高於將多個類型嵌套在一起。 – Radian 2014-10-03 15:11:57

+0

多種類型的類?無論如何;它是關於通過Try和Option免費獲得的方法。 – 2014-10-04 02:11:21

相關問題