2014-09-25 26 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

相关问题