我写它有三个可能的返回状态的方法:返回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