我寫它有三個可能的返回狀態的方法:返回Try [Option [String]]是否合理?
- 操作可以失敗與異常
- 操作可以用字符串結果
- 操作可以成功成功沒有結果
返回類型Try[Option[String]]
看起來是否正確?還是有更好的選擇?
我寫它有三個可能的返回狀態的方法:返回Try [Option [String]]是否合理?
返回類型Try[Option[String]]
看起來是否正確?還是有更好的選擇?
你的方法非常好。另一種方法是定義你自己的情況下,類/對象
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 [選項[字符串]]處於未選中狀態,因爲它由 擦除消除
我不知道爲什麼你必須添加「你自己的類型」的想法;否則它會是我的+1。 – 2014-09-25 09:09:18
這取決於你的口味。對我來說,使用平面類型覆蓋所有情況的可讀性要高於將多個類型嵌套在一起。 – Radian 2014-10-03 15:11:57
多種類型的類?無論如何;它是關於通過Try和Option免費獲得的方法。 – 2014-10-04 02:11:21
電梯的盒子並結合選項的語義和一個很好的工作,嘗試
一個盒子可以是:
http://scala-tools.org/mvnsites/liftweb-2.3/net/liftweb/common/Box.html
如果這就是你想要的粒度,那就是我要走的路。所以是的,這是有道理的。 – 2014-09-25 01:38:44
是否需要在標準庫中,或者庫是否可以?因爲這是我喜歡Lift的['Box {Full,Empty,Failure}'](http://liftweb.net/api/26/api/index.html#net.liftweb.common.Box)類型的原因之一。 (我相信斯卡拉有更好的東西,我只是不太瞭解斯卡拉茲)。 – 2014-09-25 01:47:33
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